SteffenLee

[BOJ] 1924 - 2007년[C++] 본문

Problem Solving/BOJ

[BOJ] 1924 - 2007년[C++]

SteffenLee 2022. 1. 27. 19:08

2007년 중 한 날을 입력 받고, 그 날짜의 요일을 출력하면 되는 문제입니다.

 

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
29 30 31 2/1(32) 2/2(33) 2/3(34) 2/4(35)
2/6(36) 2/7(37) 2/8(38) 2/9(39) 2/10(40) 2/11(41) .....

2007년에는 이런식으로 날이 진행되는데, 여기서 포인트는 7일을 주기로 요일이 같다는 점입니다.

1/1이 월요일 +7일 하면 1/8일이 월요일

 

이 점을 이용해서 나머지 연산자를 사용해서 나머지가 1이면 월요일, 2면 화요일... 이렇게 문제를 풀 수 있습니다.

 

코드를 보겠습니다.

#include<iostream>
#include<string>
#include<utility>

using namespace std;

int main() {
	pair<int, int> asdf;
	string yoil[7] = { "MON", "TUE", "WED", "THU", "FRI","SAT", "SUN" };
	int month[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	int totday = 0;
	int tmp;


	cin >> asdf.first >> asdf.second;//월과 일을 받음

	for (int i = 0; i < asdf.first -1 ; ++i)//구하고 싶은 월 전까지 모든 월의 일수를 더함
		totday += month[i];//다음달로 넘어가도 숫자만 다시 1로 바뀔뿐 수의 개수는 변함이 없다.
	totday += asdf.second;//그래서 찾고 싶은 날까지 쭉 카운팅 후 7로 나머지 연산을하면 요일이 나옴

	tmp = totday % 7;

	//월요일을 요일의 기준점으로(배열 인덱스 0) 잡았으므로
	//만약 나누어 떨어지면 -> 일요일이어야 한다.

	if(tmp != 0)
		cout << yoil[tmp - 1] << endl;
	else
		cout << yoil[tmp+6] << endl;
	
}

저같은 경우는 월요일이 기준점이어서 나누어 떨어지면 (값이 0이 나오면) +6을 해줘서 일요일을 출력해줘야 했습니다.

 

감사합니다.

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ]11399 - ATM [C++]  (0) 2022.01.31
[BOJ]8393 - 합 [C++]  (0) 2022.01.31
[BOJ]10951 - A+B- 4[C++]  (0) 2022.01.25
[BOJ]10950 - A + B - 3[C++]  (0) 2022.01.24
[BOJ]9517-아이 러브 크로아티아  (0) 2018.08.21
Comments