본문 바로가기

코테

[그리디] 백준 브론즈1 4796번: 캠핑(Swift)

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

 

4796번: 캠핑

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, L, P, V를 순서대로 포함하고 있다. 모든 입력 정수는 int범위이다. 마지막 줄에는 0이 3개 주어진다.

www.acmicpc.net

풀이과정

위 문제의 경우 강산이의 L일 휴가 동안 몇일 캠핑장을 이용할 수 있는지 계산하는 문제이다.

해당 캠핑장의 경우 연속된 P일 중 L일을 사용할 수 있다고 한다.

1번 케이스를 예로 들면, 강산의 휴가 기간은 20일이며, 캠핑장의 경우 연속된 8일 동안 5일을 사용할 수 있다.

강산이의 휴가를 8로 나눠보면, 몫이 2이고, 나머지가 4이다.

즉, 강산이의 휴가를 8일씩 나눠보면 8일이 두 번 나머지는 4일이다.

때문에 5일을 두 번 꽉 채워 캠핑장을 사용할 수 있고, 추가로 4일 사용할 수 있다.

정답은 [몫 * L + 나머지] 즉, 14이다.

이번엔 L = 5 / P = 8 / V = 22라고 했을 때,

강산이의 22일 휴가를 8로 나눠보면, 몫이 2 나머지가 6이다.

그럼 이 경우 위 케이스와 같이 [2 * 5 + 6 = 16]이냐?

그렇지 않다. 왜냐 나머지 6이 5보다 크기 때문에 6일 중 5일만 사용할 수 있기 때문이다.

때문에 정답은 [2 * 5 + 5 = 15] 이다.

이를 코드로 작성해 보면,

var `case` = 0

while true {
  let lpv = readLine()!.split(separator: " ").map { Int($0)! }
  
  if lpv == [0, 0, 0] { break }
  
  `case` += 1
  
  let l = lpv[0]
  let p = lpv[1]
  let v = lpv[2]
  
  let a = v / p * l
  let b = v % p > l ? l : v % p
  
  print("Case \(`case`): \(a + b)")
}

이다.