코딩테스트

[Swift 알고리즘] 백준 BOJ 2845 - 파티가 끝나고 난 뒤

유정주 2021. 9. 2. 00:10
반응형

[Swift 알고리즘] BOJ 2845 - 파티가 끝나고 난 뒤

안녕하세요. 개발 중인 정주입니다.

 

오늘은 BOJ 2845번인 "파티가 끝나고 난 뒤" 문제를 풀었습니다.

바로 시작하겠습니다.


Github

https://github.com/jeongju9216/swiftAlgorithm

문제 정보

번호, 이름 : 2845 파티가 끝나고 난 뒤

분류 : 수학, 구현, 사칙연산

문제 링크

https://www.acmicpc.net/problem/2845


풀이

간단한 구현 문제입니다.

두 개를 입력받고 두 값을 곱해줍니다. 이 값이 정확한 인원 수입니다.

다음 라인에서 5개의 입력 값과의 차이를 출력합니다.

 

제가 이 문제에서 처음 사용해본 것은 두 개의 라인에 거쳐 입력을 받는 것이었습니다.

readLine()은 EOF를 만나면 입력의 끝이라고 판단을 하기 때문에 단순히 readLine()을 두 번 사용하면 되지 않을까 예상했습니다.

그리고 제 예상대로 동작을 하였습니다.

 

두 번째로는 map {}에 대해 조금 더 이해를 하였습니다.

readLine()과 map {}을 붙여써서 어렴풋이 추측하여 코드를 작성했는데

map의 활용성에 대해 조금은 알 것 같았습니다.

Clouser와 고차함수에 대해 더 공부해봐야겠습니다.


1차 코드

let input1 = readLine()!.split(separator: " ").map { Int(String($0))! }
let exactPeopleCount = input1[0] * input1[1]

let input2 = readLine()!.split(separator: " ").map { Int(String($0))! }
for value in input2 {
    print(value - exactPeopleCount, terminator: " ")
}

메모리 : 62232 KB

시간 : 8 ms

코드 길이 : 267 Byte

 

스스로 작성한 코드입니다.

지난 포스팅에서 언급했듯이 import Foundation이 불필요한 시간을 소요해서 뺐습니다.

정석대로 입력을 받고 상수에 값을 계산해서 할당한 뒤 for-in을 이용해 출력합니다.

나름대로 코드를 줄여보겠다고 print()의 terminator 속성을 사용하여 출력 코드를 줄였습니다.


2차 코드

let exactPeopleCount : Int = {
    let input = readLine()!.split(separator: " ").map { Int(String($0))! }
    return input[0] * input[1]
}()

let result = readLine()!.split(separator: " ").map {
    String(Int(String($0))! - exactPeopleCount)
}.joined(separator: " ")
print(result)

메모리 : 62232 KB

시간 : 8 ms

코드 길이 : 282 Byte

 

다른 분의 코드를 최대한 이해하여 제 코드에 적용하였습니다.

클로저로 추측되는 문법으로 exactPeopleCount를 구하였습니다.

출력부는 for-in이 아닌 map을 이용하였고 joined()를 이용해 결합하였습니다.

 

좀 더 고급스러운 느낌이나 메모리, 시간을 줄이지는 못했고 코드 길이만 길어졌습니다.

제가 클로저와 map에 대해 이해도가 높았다면 스스로 이렇게 작성할 수 있었을텐데 생각하였습니다.

마지막 발악으로 3차 시도를 해보았습니다.


최종 코드

let exactPeopleCount : Int = {
    let input = readLine()!.split(separator: " ").map { Int(String($0))! }
    return input[0] * input[1]
}()
print(readLine()!.split(separator: " ").map { String(Int(String($0))! - exactPeopleCount) }.joined(separator: " "))

메모리 : 62232 KB

시간 : 8 ms

코드 길이 : 257 Byte

 

마지막 발악으로 코드 길이만이라도 줄여보자하여 print()에 모두 넣었습니다.

코드 길이는 줄어들었으나 코드가 깨끗하지 않고 가독성이 떨어졌다는 것을 깨달았습니다.

이렇게 작성할 바에 2차 코드를 사용할 것 같습니다.


마무리 인사

해당 문제의 채점 결과 목록을 보면 미미하게나마 더 빠른 코드가 존재했습니다.

알고리즘은 시간이 1순위라고 생각하여 해당 코드를 보고 이해, 적용해보려 했으나

아직 Swift 문법이 익숙하진 않네요.

 

이해하지 못한 코드를 제출하는건 의미가 없다고 생각되어 여기에서 마무리하고

다음을 기약합니다.

 

감사합니다.


아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

반응형