본문 바로가기
Online-Judge/Programmers

[Programmers] C++ 2016년

by nyangzzi 2022. 1. 2.
반응형

https://programmers.co.kr/learn/courses/30/lessons/12901

 

코딩테스트 연습 - 2016년

2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까

programmers.co.kr


요일을 구하는 문제를 풀 때 가장 핵심적인 부분은, 월이 바뀌어도 요일은 이어진다는 것이다. 

 

아래는 2016년 1월의 달력이다. 

1월 1일이 금요일인 것을 시작으로, 12월 31일까지 멈추지 않고 일주일(7일)이 돌아가며 나타난다.

즉, 1월 1일부터 7의 배수만큼 흐른 날은 무조건 '금요일'이다.

 

예를 들어, 1월 1일부터 7일 후인 8일 역시 금요일이며, 21일(7*3)일 후인 22일 역시 금요일이다. 

 

일주일은 멈추지 않고 돌아가므로, 다른 요일 역시 마찬가지이다.

1월 10일은 1월 3일로부터 7(7*1)일이 흐른 뒤이며, 이때 1월 3일은 일요일로 1월 1일보다 이틀이 흐른 뒤다.

 

따라서 해당 월-일이 되기 전까지 1월 1일로부터 며칠이나 흘렀는지 계산한다면, 해당 월-일이 어떤 요일인지 쉽게 구할 수 있다.

 


 

1. 각 월에 해당하는 날을 값으로 가진 month 배열을 선언한다.

month[i-1] 에는 i월에 해당하는 날짜가 들어있다. 예를 들면, 11월은 30일까지 있으므로 month[11-1] 에는 30이 들어있다.

이때, 2016년은 윤년이므로 2월은 29일까지 있음에 주의한다.

int month[12]={31,29,31,30,31,30,31,31,30,31,30,31};

 

2. 1월 1일로부터 며칠이 흘렀는지 계산한다.

4월 21일이 며칠인지 구하고 싶다면, 아래와 같이 1~3월의 날짜를 모두 더한 뒤 21을 더해주면 된다.

int day = 0;

for(int i=0; i < a - 1; i++){
    day += month[i];
}

day+=b;

 

3. 며칠 후인지 계산했다면, 이제 나머지를 통해 어떤 요일인지 구할 수 있다.

일주일은 7일이므로 7로 나머지 연산을 하면 나머지에 따라 각각 다음과 같은 요일임을 알 수 있다.

 

1 - 금

2 - 토

3 - 일

4 - 월

5 - 화

6 - 수

0 - 목

day%= 7;
    
string answer = "";

switch(day){
    case 1: answer = "FRI"; break;    
    case 2: answer = "SAT"; break;
    case 3: answer = "SUN"; break;
    case 4: answer = "MON"; break;
    case 5: answer = "TUE"; break;
    case 6: answer = "WED"; break;
    case 0: answer = "THU"; break;
}

return answer;

 


🔥전체 코드

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

int month[12]={31,29,31,30,31,30,31,31,30,31,30,31};

string solution(int a, int b) {
    
    int day = 0;
    for(int i=0; i < a - 1; i++){
        day += month[i];
    }
    day+=b;
    day%= 7;
    
    string answer = "";

    switch(day){
        case 1: answer = "FRI"; break;
        case 2: answer = "SAT"; break;
        case 3: answer = "SUN"; break;
        case 4: answer = "MON"; break;
        case 5: answer = "TUE"; break;
        case 6: answer = "WED"; break;
        case 0: answer = "THU"; break;
    }
    return answer;
}

 

반응형

댓글