티스토리 뷰

반응형

강산이가 캠핑장에서 최대로 머무를 수 있는 일수를 구하는 문제 

 


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

 

4796번: 캠핑

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

www.acmicpc.net

 

 

문제의 조건

 

1. 강산이가 간 캠핑장은 연속된 P일 중에 L일만 머무를 수 있다. 20일 중에 10일만 머무를 수 있거나 8일 중에 5일만 머무를 수 있거나...

 

2. 강산이는 이제 막 V일짜리 휴가를 시작했다. 28일짜리 휴가를 시작했거나 15일짜리 휴가를 시작했거나...

 

3. 여러 테스트 케이스가 5(L) 8(P) 20(V) 와 같은 형태로 순서대로 주어질 때 강산이의 휴가기간 동안 캠핑장에 최대로 머물 수 있는 일수를 구해서

ex) Case 1: 14 와 같이 출력한다. 

테스트 케이스의 마지막에는 0 0 0이 주어진다. 

 

 

풀이 과정

 

웬일로 쉽게 풀렸는데 그 과정을 적어보자면 

 

1. 연속된 8일 중에 5일만 머무를 수 있고 휴가가 20일이라면 16일 동안 최대 10일동안 머무를 수 있다. 

 

2. 17일째가 되면 캠핑장 날짜가 리셋되니까 다시 5일동안 머무를 수 있는데 강산이의 휴가는 20일에 끝난다. 

 즉 17, 18, 19, 20 4일동안 머무를 수 있다. 

 

3. 1번에서 구한 10과 2번에서 구한 4일을 더하면 14일이 된다. 

 

4. 여기에서 휴가 일수를 연속된 P일로 나눈 몫을 L일에 곱하면 휴가 기간동안 무조건 머무를 수 있는 최소 일수를 구할 수 있다. 

 

5. 마지막으로 휴가 일수를 P일로 나누고 남은 나머지 중에서 며칠동안 머무를 수 있는지 구해서 4번에 더해줘야 최종 답이 되는데, 

 L일보다 남은 휴가 일수가 길 수도 있고 짧을 수도 있다. 남은 휴가 일수가 L일보다 길다면 L일만큼만 더해주고 짧다면 남은 휴가 일수를 더해준다. 

 

 

코드

 

#include <iostream>

using namespace std;

int main(int argc, const char * argv[])
{
    int Case = 1;
    while (true)
    {
        int limit, wholeDays, vacation;
        cin >> limit >> wholeDays >> vacation;
        
        if (0 == limit && 0 == wholeDays && 0 == vacation) break;
        
        int possible = vacation / wholeDays;
        int left = vacation % wholeDays; //휴가 일수를 연속된 P일로 나눈 나머지 
        int answer = possible * limit;
        answer += min(left, limit); //나머지와 L일 중 작은 것을 더한다. 
        
        cout << "Case " << Case << ": " << answer << endl;
        Case++;
    }
    
    return 0;
}

 

그리디를 한 번에 빨리 푸니까 좀 낯설다... 머선일 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함