본문 바로가기
PS/BOJ

[PS] 백준 23628번 - 악마의 연차 계산기 | C++

by spareone 2022. 10. 18.

백준 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';
}

댓글