Code KATA/알고리즘 코드카타

[2025.01.24] 2016년

iiblueblue 2025. 1. 24. 09:51

문제 설명

2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a, b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까지 각각 SUN, MON, TUE, WED, THU, FRI, SAT 입니다. 예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 "TUE"를 반환하세요.

 

 

제한사항

  • 2016년은 윤년입니다.
  • 2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다.)

 

 

입출력 예

a b return
5 24 "TUE"

 

 

문제 풀이

풀이 언어 : C++

#include <string>
#include <vector>

using namespace std;

string solution(int a, int b) {
    string answer = "";
    
    string day_of_the_week[7]={"THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"}; // 요일
    int day=0; // 날짜를 일로 환산한 값
    
    // 월에 따라 일수 더하기
    for(int month=1; month<a; month++)
    {
        if(month==2) // 2월
        {
            day+=29;
        }
        else if(month>=1&&month<=7) // 1월 ~ 7월
        {
            if(month%2==0) // 짝수 달
            {
                day+=30;
            }
            else // 홀수 달
            {
                day+=31;
            }
        }
        else if(month>=8&&month<=12) // 8월 ~ 12월
        {
            if(month%2==0) // 짝수 달
            {
                day+=31;
            }
            else // 홀수 달
            {
                day+=30;
            }
        }
    }
    
    // 남은 일수 더하기
    day+=b; 
    
    // 요일 알아내기
    answer=day_of_the_week[day%7];
    
    return answer;
}

지금부터 할 일은 a월 b일을 일자로만 만드는 것이다. a월의 달은 몇일인지 알아내고 b와 더하면 a월 b일이 1월 1일부터 몇일이나 지난 것인지 알 수 있다.

 

월을 일로 바꾸는 작업은 생각보다 직관적이고 간단하다. 일단 크게 세 가지 경우로 나눈다. 2월, 1월~7월, 8월~12월. 이렇게 셋으로 나누어 각각 다른 일수를 더해주면 된다. 2월은 윤년이기 때문에 29일을 day에 더해준다. 그리고 1월~7월은 짝수달에는 30일을, 홀수 달에는 31일을 더한다. 반대로 8월~12월은 짝수 달에는 31일을, 홀수 달에는 30일을 더한다. 1월부터 a-1월까지 반복문을 이용해 총 몇일인지를 구한다.

 

마지막으로 b일을 더해주면 1월 1일부터 a월 b일까지가 몇일인지를 알 수 있다. 마지막으로 그렇게 구해진 day를 이용해 요일만 구하면 된다. 요일을 구하기 위해 위에 요일을 적은 string 배열을 만들어 놨다. day를 7로 나눈 나머지를 index로 사용할 것이기 때문에 배열은 목요일 부터 시작하게 해두었다. 1월 1일이 금요일이기 때문이다.

 

1월 1일이 금요일이고 한 주 뒤의 금요일은 1월 8일이다. 즉 앞으로 금요일은 일수에 나누기 7을 했을 때 나머지가 1인 날이라는 뜻이다. 바로 앞 목요일은 7일로 7로 나눴을 때 나머지가 0이다. 그래서 목요일을 제일 처음으로 순서대로 배열을 구성한 것이다. day를 7로 나눈 나머지를 index로 하여 요일을 알아내고 정답을 반환한다.

 

 

문제 링크

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

 

'Code KATA > 알고리즘 코드카타' 카테고리의 다른 글

[2025.01.28] 소수 만들기  (0) 2025.01.28
[2025.01.07] 모의고사  (0) 2025.01.27
[2025.01.23] 명예의 전당 (1)  (1) 2025.01.23
[2025.01.22] 콜라 문제  (0) 2025.01.22
[2025.01.21] 푸드 파이트 대회  (0) 2025.01.21