728x90
반응형
문제
https://www.acmicpc.net/problem/4796
해설
문제를 접하고 처음 생각했을 땐,
대체 어떻게 테스트 케이스가 5, 8, 20인데 답이 14가 나오는지 이해가 안됐었다.
강산이의 휴가 기간이 20일이라 8일이 연속되는 날은 2번 밖에 없다고 생각했기 때문이었다.
이게 아니고 한달(30 혹은 31일) 중 8일이 연속되기만 하면 되는거였다.
이제 다시 풀려고 보면 쉬운 문제였다.
테스트 케이스 5, 8, 20을 생각해보면
1 2 3 4 5 6 7 8 / 9 10 11 12 13 14 15 16 / 17 18 19 20
이렇게 20일을 연속되는 8일로 구분지어 볼 수 있다.
8일이 완전히 있는 날 들은 2번이 있고, 그 2번은 5일을 사용할 수 있다.
그러나 뒤의 회색으로 표시된 날은 4일밖에 남지 않았다.
그럼 총 (5 * 2) + 4일을 사용할 수 있다는 것이 된다.
회색으로 남은 날과 캠핑장 사용 가능한 날(L)을 비교했을 때,
L이 남은 날보다 더 적은 날이 있을 수 있고, 큰 날이 있을 수 있다.
이걸 경우에 따라 나눠줄 수도 있겠지만 그건 너무 비효율적이다.
어차피 L과 남은 날 중 더 적은 날 만큼만 사용할 수 있기 때문에 그냥 min()을 통해 적은 날을 찾아 더해주면 된다.
코드
-파이썬
#백준 4796(캠핑)
case = 0 #테스트 케이스 개수
while True:
l, p, v = map(int, input().split()) # 캠핑 사용 날짜, 연속 날짜, 휴가 기간
sum = 0 #캠핑장 사용 가능 최대 일수
if l == 0 and p == 0 and v == 0:
break
else:
sum = (v // p) * l #완전히 사용 가능한 기간
sum += min((v % p), l) #남은 날 중 사용 가능한 기간
case += 1
print("Case %d: %d" %(case, sum))
-자바
//백준 4796(캠핑)
import java.util.*;
import java.io.*;
public class Boj_4796 {
public static void main(String[] args) throws IOException{
Scanner sc = new Scanner(System.in);
int test = 0;
while(true) {
int l = sc.nextInt(); //캠핑 사용 날짜
int p = sc.nextInt(); //연속 날짜
int v = sc.nextInt(); //휴가 기간
int sum = 0; //캠핑장 사용 가능 최대 일수
if(l == 0 && p == 0 && v == 0) {
break;
}
else {
sum = (v / p) * l;
sum += Math.min((v % p), l);
test += 1;
System.out.println("Case " + test + ": "+ sum);
}
}
}
}
728x90
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[파이썬, 자바] BOJ_1783(병든 나이트) (0) | 2021.01.27 |
---|---|
[파이썬, 자바] BOJ_16435(스네이크버드) (0) | 2021.01.26 |
[파이썬, 자바] BOJ_2828(사과 담기 게임) (0) | 2021.01.22 |
[파이썬, 자바] BOJ_15904(UCPC는 무엇의 약자일까?) (0) | 2021.01.21 |
[파이썬, 자바] BOJ_1459(걷기) (0) | 2021.01.20 |