프로그래밍/코딩 문제 풀이

프로그래머스 2024.01.16 (1Lv 2016년)

Rozentea 2024. 1. 16. 16:54

문제


문제 설명
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 result
5 24 "TUE"

코딩


#include <string>
#include <vector>

using namespace std;

string solution(int a, int b) {
    string answer = "";

    vector<int> vec_month = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    vector<string> vec_day = { "NONE", "FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU" };

    int iDay = 0;

    for (int i = 1; i < a; ++i)
    {
        iDay += vec_month[i];
    }

    iDay = iDay + b;
    while (!((iDay - 7) <= 7))
    {
        iDay -= 7;
    }

    if(iDay > 7)
        iDay -= 7;

    answer = vec_day[iDay];

    return answer;
}

 

우선 주어진 달과 일을 일단위로 계산해서 7을 계속해 빼서 나머지를 이용해 일을 계산하려 했다.

때문에 1월1일이 금요일이라는 것을 기준으로 vec_day를 만들어주었고, 각 달마다 일을 더해주기 위해 vec_month라는 배열을 만들었다.

 

따라서 주어진 달과 일이 1월1일로부터 몇 일차인지 계산을 하고, 반복문을 이용해 7을 빼주며, 1~7사이의 수를 구했다.

이후 해당 일을 idx로 vec_day에서 찾아 알맞은 요일을 출력해주었다.

 

또, 2월은 윤년이기 때문에 29를 더할 수 있도록 vec_month를 잡아주었다.

 

날짜 관련 문제는 계산하는게 쉽게되지 않아서 비슷한 유형의 문제를 많이 풀어봐야겠다..

원래는 나머지 연산자를 이용하려 했으나, 나머지 연산자는 정수 자료형으로만 반환되어 원하는 나머지가 제대로 나오지 않아 어려움을 느꼈다.

 

만든 식이 깔끔하지 않고, 마음에 안들어서 추가적으로 공부를 하려한다.

실행 결과