티스토리 뷰

알고리즘/백준

[백준] 4796번 캠핑

머어하지 2018. 10. 21. 10:24

생각

Github - https://github.com/hellojdh/Code/blob/master/src/baekjoon/q1000/Q4796.java 연속 된 P일중 L일 동안 캠핑장을 사용할 수 있다. 휴가는 총 V일 이다. 최대로 캠핑장을 이용할 수 있는 일수를 출력하여라.


처음 생각

수학이라고 생각해야 할 까 그리디라고 생각해야 할까 어떻게 보던지 간에 둘 다 맞는것 같다. 몫과 나머지를 구해도 상관이 없고, 최대로 라는 조건이 주어졌기 때문에 우선적으로 L일을 사용하고 P-L일을 더해주는 식으로 V일 까지 접근을 해도 된다.

▶ 수학적인 접근은 항상 빠르므로 수학적으로 풀어보았다.


다음 생각

연속하는 P일 중 L일이므로 L일을 다 사용하기 위해서는 우선 P일을 사용해야한다. 따라서 주어진 휴가기간 V일 동안 몇 번의 P일이 있는지 V/P를 이용해서 구해주었다. 1번의 P일동안 L일 사용가능하므로 (V/P)*L로 모든 P일 안에서 L일 동안 이용할 수 있는 수를 구해주었다.


다다음 생각

V/P를 하면 나머지가 있을수도 있고 없을 수도 있다. 연속된 P일 이지만 짤린 P일 인것이다. 따라서 이 나머지는 모두 이용이 가능하다.

▶ 여기서 고려해야 할 점은 나머지가 이용할 일 수 보다 큰 경우이다. 따라서 나머지가 L 보다 작으면 나머지 일수를 모두 이용하면되고, 그 반대라면 이용가능 일 수인 L을 모두 이용해주면 된다.


방안

1) 수학적 풀이


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package baekjoon.q1000;
 
import java.util.Scanner;
 
public class Q4796 {
    static int l,p,v;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int tc = 1;
        while(true) {
            l = sc.nextInt(); // L일 동안
            p = sc.nextInt(); // 연속 P일중
            v = sc.nextInt(); // 휴가 V일
            // 0이 들어오면 종료
            if(l==0break;
            // 최대로 이용할 수 있는 날을 따져주어야하므로
            // 우선 연속 P가 최대 몇 번오나 따져준 후 (v/p)
            // 남은 날 수(v%p)가 이용 가능일 L 모다 작으면 전부 이용 아니라면 L 만큼만 이용한다.
            System.out.println("Case "+tc+": "+((v/p)*l+Math.min(l,v%p)));
            tc++;
        }
    }
}
 


2) 그리디 풀이


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package baekjoon.q1000;
 
import java.util.Scanner;
 
public class Q4796_Greedy {
    static int l,p,v;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int tc = 1;
        while(true) {
            l = sc.nextInt(); // L일 동안
            p = sc.nextInt(); // 연속 P일중
            v = sc.nextInt(); // 휴가 V일
            // 0이 들어오면 종료
            if(l==0break;
            // 그리디로 접근해 보자.
            int result = 0;
            // 우선 v일 동안 진행이된다.
            for(int i=0;i<v;) {
                // l일을 사용해준다.
                result += l;
                // l일을 증가시켜준다.
                i += l;
                // v일 을 초과하면 그만큼 빼준다.
                if(i>=v) result -= i-v;
                // P-L일을 더해준다.
                i+=p-l;
            }
            System.out.println("Case "+tc+": "+result);
            tc++;
        }
    }
}
 

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 14391번 종이 조각  (1) 2018.10.24
[백준] 10819번 차이를 최대로  (0) 2018.10.23
[백준] 1182번 부분집합의 합  (0) 2018.10.20
[백준] 2503번 숫자 야구  (0) 2018.10.20
[백준] 10448번 유레카 이론  (0) 2018.10.20
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday