2869번: 달팽이는 올라가고 싶다
let input = readLine()!.split(separator: " ").map { Int(String($0))! }
let A = input[0]
let B = input[1]
let V = input[2]
var days = (V - A) / (A - B)
let rem = (V - A) % (A - B)
if rem != 0 {
print(days + 2)
} else {
print(days + 1)
}
- 미끄러지는 것을 감안했을 때 하루에 (A - B) 만큼 전진하는 달팽이입니다.
- 정상에 도달했을 때는 미끄러지지 않으므로 마지막날은 (A - B)가 아니라 무조건 A만큼 전진할 수 있습니다. 따라서 V가 아니라 (V - A)를 (A - B)로 나누어서 걸리는 날인 days를 구해놓습니다.
- 이제 마지막으로 남은 길이만큼의 전진하는 동안 걸리는 날을 구해야 합니다. 아래 그림을 같이 보도록 하죠!
- 먼저 나머지가 x만큼 있는 경우입니다. 이 경우 마지막 날 전까지 남은 길이는 A + x입니다. 즉 A만큼 전진해도 x가 남습니다. 마지막 하루 만에 올라갈 수가 없겠죠? 물론 x는 A - B보다 작으므로 이튿날에는 무조건 올라갈 수 있습니다. days에 + 2를 해줍시다.
- 마지막으로 나누어 떨어지는 경우입니다. 이 때는 남은 길이가 딱 A만큼 남았습니다. 따라서 마지막 날 A만큼 올라 정상에 도달했기 때문에 더 이상 미끄러지지 않습니다. days에 +1만 해주면 됩니다.
- 처음에 V - A를 가지고 계산해야한다는 점이 떠올리기 어렵습니다. 그리고 마지막 남은 길이 동안에 벌어질 일을 따지는 것도 쉽지는 않아요. 코드 자체는 그렇게 어려운 것이 없지만 말입니다.