백준 23628번 문제 write-up입니다.
https://www.acmicpc.net/problem/23628
23628번: 악마의 연차 계산기
첫 번째 줄에는 연차와 월차의 총 개수를 공백을 사이에 두고 출력한다. 두 번째 줄에는 총 근무 기간의 뒤에 days를 붙여서 출력한다. 근무 기간이 1일이더라도 day가 아닌 days를 붙여서 출력해
www.acmicpc.net
입사일, 현재일을 입력하면 연차, 월차, 총 근무일을 출력하는 프로그램입니다.
총 근무일을 구한 뒤 이것을 기준으로 연차, 월차를 계산하는 순서로 작성했습니다.
이 문제에서 제시한 달력은 1달은 30일, 1년은 12개월이며 1년이 360일입니다.
1. 총 근무일 계산
Year - Month - Day 따로 입력받기 때문에 각 항목을 뺀 후 모두 더하면 됩니다.
((현재 연도 - 입사 연도) * 360) + ((현재 월 - 입사 월) * 30) + (현재 일 - 입사 일)
이렇게 계산하면 총 근무일이 나옵니다.
2. 연차 계산
문제에서 제시하는 연차 지급 조건입니다.
- 연차는 1년에 A + 15개를 지급한다.
- A의 값은 입사할 때 0으로 시작해 2n + 1년 차마다 1씩 커진다. 예를 들어, 1 ,2년 차에는 A = 0이다. 3, 4년 차에는 A = 1이고, 5, 6년 차에는 A = 2이다.
A 계산이 되어야 연차 계산이 가능합니다.
저는 이렇게 계산했습니다.
n이 근무한 연도라고 할 때,
n = 1 or n = 2일 경우 n을 1로 고정, n = 3 or n = 4일 경우 n을 3으로 고정... n = i or n = i + 1일 경우 n을 i로 고정합니다.
이후 A 값을 계산합니다.
A = n - (n / 2 + 1)
A값 계산 후 A + 15하면 연차가 나옵니다.
3. 월차 계산
문제에서 제시하는 월차 지급 조건입니다.
- 월차는 3년차(36개월차)까지 1개월(30일)이 지날 때마다 하나씩 지급한다. 즉 최대 36개를 지급할 수 있다.
즉, 3년이 지나면 월차는 36개 고정입니다.
전체 근무일에서 30을 나누면 몇 개월 일했는지 나옵니다.
해당 값이 월차이며, 36이 넘은 경우 값을 36으로 고정시키면 됩니다.
해당 풀이로 작성한 소스코드입니다.
#include <iostream>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int recruit[3];
int now[3];
for(int i = 0; i < 3; i++) cin >> recruit[i];
for(int i = 0; i < 3; i++) cin >> now[i];
/* 근무 기간 계산 */
int total = ((now[0] - recruit[0]) * 360) + ((now[1] - recruit[1]) * 30) + (now[2] - recruit[2]);
/* 연차 계산 */
int year = total / 360;
int annual = 0;
for(int i = 1; i <= year; i++) {
int temp = i;
if(temp % 2 == 0) temp--;
int a = temp - (temp / 2 + 1);
annual += a + 15;
}
/* 월차 계산 */
int monthly = total / 30;
if(monthly > 36) monthly = 36;
cout << annual << ' ' << monthly << '\n';
cout << total << "days" <<'\n';
}
'PS > BOJ' 카테고리의 다른 글
[PS] 백준 1003번 - 피보나치 함수 | C++ (0) | 2022.11.01 |
---|---|
[PS] 백준 10814번 - 나이순 정렬 | C++ (0) | 2022.10.28 |
[PS] 백준 10824번 - 네 수 | C++ (0) | 2022.10.28 |
[PS] 백준 25305번 - 커트라인 | C++ (0) | 2022.10.24 |
[PS] 백준 23627번 - driip | C++ (0) | 2022.10.18 |
댓글