본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 1924 2007년

by 까망 하르방 2021. 9. 17.
반응형

출처https://www.acmicpc.net/problem/1924

Approach

2007년 x월 y일은 어떤 요일인지 출력하는 문제이다.

e.g) 월요일 MON, 화요일 TUE, ... 일요일 SUN

 

LUT(Look up Table)를 활용하면 쉽게 구현할 수 있는 문제이다.

▶ [알고리즘] 시간 성능 향상을 위한 코드 최적화 (C/C++) 

 

달마다 마지막 일수가 다르다.

그렇기에 문제에서 지정한 1월 1일 월요일로부터 몇 일 지났는지로 환산할 수 있다.

예를 들어 3월 13일로 예를 들어보자.

 

3월 13일은 1월 + 2월 + 13일이 경과한 시간으로

= 31 + 28 + 14 = 73일 (1월 1일로부터) 이다.

 

일주일 단위로 7일로 주기가 고정이므로

73 % 7 = 3  수요일(WED)에 해당한다.

 

즉, (1월 1일로 부터 경과한 일수) % 7 이다.

문제에서 요구한 내용을 수학적(?)으로 계산해주면 된다.

▶ 개발자(프로그래머)는 <수학>을 잘해야할까?  


#include <iostream>
#include <string>
using namespace std;

int dayPerMonth[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
string week[7] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
int m, d;

int main()
{
    // freopen("input.txt", "r", stdin);
    scanf("%d %d", &m, &d);


    for (int i = 1; i < m; ++i)
    {
        d += dayPerMonth[i];
    }
    
    cout << week[d % 7] << endl;
}

 

수식을 이용하지 않는다면 아래와 같이 월별로 요일을 계산할 수도 있다.

나머지 이용(7 == 0 으로 생각)

    1월: 1 2 3 4 5 6 7

    2월: 5 6 7 1 2 3 4

    3월: 5 6 7 1 2 3 4

    4월: 2 3 4 5 6 7 1

    5월: 7 1 2 3 4 5 6

    6월: 4 5 6 7 1 2 3

    7월: 2 3 4 5 6 7 1

    8월: 6 7 1 2 3 4 5

    9월: 3 4 5 6 7 1 2

    10월: 1 2 3 4 5 6 7

    11월: 5 6 7 1 2 3 4

    12월: 3 4 5 6 7 1 2

#include <iostream>
using namespace std;

int main() 
{
    int m, d;
    cin >> m >> d;
    
    if (m == 2 || m == 3 || m == 11) {
        d = d + 3;
    }
    else if (m == 4 || m == 7) {
        d = d + 6;
    }
    else if (m == 9 || m == 12) {
        d = d + 5;
    }
    else if (m == 6) {
        d = d + 4;
    }
    else if (m == 8) {
        d = d + 2;
    }
    else if (m == 5) {
        d = d + 1;
    }
    if (d % 7 == 0) {
        cout << "SUN";
    }
    else if (d % 7 == 1) {
        cout << "MON";
    }
    else if (d % 7 == 2) {
        cout << "TUE";
    }
    else if (d % 7 == 3) {
        cout << "WED";
    }
    else if (d % 7 == 4) {
        cout << "THU";
    }
    else if (d % 7 == 5) {
        cout << "FRI";
    }
    else if (d % 7 == 6) {
        cout << "SAT";
    }
}
반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 1155 변형 하노이  (0) 2021.09.18
[BOJ] 백준 1476 날짜 계산  (0) 2021.09.18
[BOJ] 백준 1568 새  (0) 2021.09.15
[BOJ] 백준 1550 16진수  (0) 2021.09.14
[BOJ] 백준 1316 그룹 단어 체커  (0) 2021.09.13

댓글