TIL/알고리즘 공부

백준 2839번 Swift 알고리즘 연습

여의도사노비 2022. 8. 28. 16:03
728x90

가장 최소의 횟수로 물체를 움직여야하는 문제이다.

5와 3의 배수를 이용하되 5의 배수로 나누어 떨어지는 경우가 가장 횟수를 줄이기 쉬운 방법이라는 것을 염두에 두고 풀면 된다.

 

이 문제를 풀면서 생각한 논리적 흐름은

  1. input 값이 5로 나누어 떨어진다면 그 횟수가 최소이다.
  2. 5로 나누어지지 않는다면 최대한 5kg 부터 옮겨주고 남은 중량을 3kg로 옮겨주는 것이 최소 횟수이다.
  3. 5로 최대한 나누고 남은 중량을 3으로 나눴는데도 나누어 떨어지지 않는다면 그건 옮기지 못할 중량이다.

문제는 비교적 단순한데 while 문을 잘 안써서 그런지 while문 쓰는데 너무 헷갈렸다... while을 until의 개념으로 사용해버린 것 같다.

다행히 값이 안나오는 이유에 대해 의문을 품고 다시 while을 찾아보게 되었다... 30분 넘게 while 보느라 이젠 앞으로 안까먹을듯 :)

 

 

* 2839번

let input = Int(readLine()!)!

var a = input / 5

while true {
    if (input - 5 * a) % 3 == 0 {
        print(a + (input - 5 * a) / 3)
        break
    }
    
    a -= 1
    
    if a < 0 {
        print(-1)
        break
    }
}

 

 

정리(Today I Learned)

  1. while의 반복 조건은 '~인 동안'이다. '~가 나올 때까지'가 아니다!