티스토리 뷰
강산이가 캠핑장에서 최대로 머무를 수 있는 일수를 구하는 문제
https://www.acmicpc.net/problem/4796
문제의 조건
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;
}
그리디를 한 번에 빨리 푸니까 좀 낯설다... 머선일
'알고리즘 문제 풀이 > Greedy' 카테고리의 다른 글
[C++] 백준 온라인 저지 1744번 수 묶기 풀이 (0) | 2021.11.07 |
---|---|
[C++] 백준 온라인 저지 1439번 뒤집기 풀이 (0) | 2021.11.06 |
[C++] 백준 온라인 저지 1715번 카드 정렬하기 풀이 (0) | 2021.11.03 |
[C++] 백준 온라인 저지 1339번 단어 수학 풀이 (0) | 2021.10.31 |
[C++] 백준 온라인 저지 13305번 주유소 풀이 (0) | 2021.10.26 |
- Total
- Today
- Yesterday
- 기초
- 컴퓨터공부
- 컴퓨터
- 하드웨어
- C언어기초
- 알고리즘
- 그리디
- 백준
- 영어공부
- 캐나다
- dp
- 프로그래머스
- hackerrank
- 깊이우선탐색
- 너비우선탐색
- 스위프트플레이그라운드
- greedy
- DFS
- c++
- 프로그래밍
- BFS
- 문제풀이
- c언어
- 아이패드
- 캐나다생활
- 컴퓨터사이언스
- 코딩공부
- 애플
- 해커랭크
- 다이나믹프로그래밍
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |