PS/BOJ
[알고리즘] 백준 23628번 : 악마의 연차 계산기 (C++)
도비(Doby)
2021. 11. 22. 07:57
https://www.acmicpc.net/problem/23628
23628번: 악마의 연차 계산기
360일 일하면, 휴가를 받아야 함이 마땅하다. 그에 따라, 우리 회사도 연차와 월차를 주고자 한다. 연차와 월차는 사용하면 하루 쉴 수 있는 것이다. 그런데, 인력이 너무 부족한 탓에 그만…. 지
www.acmicpc.net
처음엔 많은 조건 분기로 풀었으나 이는 너무 복잡한 코드였다.
#include <iostream>
using namespace std;
int main() {
int y, m, d;
int dy, dm, dd;
cin >> y >> m >> d;
cin >> dy >> dm >> dd;
int year = 0;
int month = 0;
int days = 0;
if (dy == y) {
if (dm == m) {
year = 0;
month = 0;
days = dd - d;
}
else if (dm > m) {
year = 0;
if (dd >= d) {
month = dm - m;
days = (dm - m) * 30 + dd - d;
}
else {
month = dm - m - 1;
days = (dm - m - 1) * 30 + 30 - d + dd;
}
}
}
else if (dy > y) {
if (dm == m) {
if (dd >= d) {
month = (dy - y) * 12;
days = month * 30 + dd - d;
}
else if (dd < d) {
month = (dy - y) * 12 - 1;
days = month * 30 + 30 - d + dd;
}
}
else if (dm > m) {
if (dd >= d) {
month = (dy - y) * 12 + (dm - m);
days = month * 30 + dd - d;
}
else if (dd < d) {
month = (dy - y) * 12 + (dm - m) - 1;
days = month * 30 + 30 - d + dd;
}
}
else if (dm < m) {
if (dd >= d) {
month = (dy - y - 1) * 12 + 12 - m + dm;
days = month * 30 + dd - d;
}
else if (dd < d) {
month = (dy - y - 1) * 12 + 12 - m + dm - 1;
days = month * 30 + 30 - d + dd;
}
}
}
int yearCnt = month / 12;
year += 15 * yearCnt;
for (int i = 1; i <= yearCnt; i++) {
year += (i - 1) / 2;
}
if (month >= 36) {
month = 36;
}
cout << year << ' ' << month << '\n';
cout << days << "days";
return 0;
}
[AC 코드]
단순히 입력받은 날 2개를 다 날짜로 바꿔서 비교하면 간단하게 풀리는 문제다.
#include <iostream>
using namespace std;
int main() {
int y, m, d;
int dy, dm, dd;
cin >> y >> m >> d;
cin >> dy >> dm >> dd;
int day1 = 360 * (y - 1) + 30 * (m - 1) + d;
int day2 = 360 * (dy - 1) + 30 * (dm - 1) + dd;
int days = day2 - day1;
int month = days / 30;
int yearCnt = month / 12;
int year = 0;
year += 15 * yearCnt;
for (int i = 1; i <= yearCnt; i++) {
year += (i - 1) / 2;
}
if (month >= 36) {
month = 36;
}
cout << year << ' ' << month << '\n';
cout << days << "days";
return 0;
}