항해99 9일차 개발일지

홍당무·2022년 11월 24일
0

알고리즘 2016년 달력 문제

총 28문제를 풀어야하는 마라톤 기간동안 첫 번째 난관에 봉착했다.

문제를 처음 읽고 든 생각은 '일주일은 7일이니깐 1월 1일의 요일을 알고 있으니 7씩 더하다 보면 인자값을 받았을 때, 정답이 나오는 함수를 구상하면 되겠구나..' 였다.

그리고 윤년이 포함된 연도는 1년이 총 366일이니 1월 1일부터 7씩 더하면서 원하는 날짜의 일주일이 시작되면 요일을 찾는다. 라고 생각했지만 나의 수준으로는 머리를 꽁꽁싸매도 답이 나오질 않아 2시간 정도만에 포기했다.

두 번째 방법으로는 귀찮더라도 Switch문을 활용해 각 월별로 요일을 전부 적는 것이다. 이 것은 글 말미에 후술하겠지만 시간이 굉장히 오래 걸리는 작업이고 효율적인 코드가 아니기 때문에 포기했다. 그렇게 답보상태에 빠져 얼마간 시간이 흐른 후, 두 번쨰 방법을 적다가 불현듯 첫 번째 방법에 대한 아이디어가 떠올랐다.

그 것은 a월 b일이라는 값이 주어졌을 때, a월의 총 일수를 구하고 +b일을 한다면 총 일 수가 나오니 1월1일 금요일을 기준으로 switch 문을 돌리는 것이다.

먼저 int[] day = {31,29,31,30,31,30,31,31,30,31,30,31}; 라는 변수를 선언과 동시에 초기화함으로써 a값을 구하기 위한 준비물을 챙겼다.

또한 month와 today를 따로 선언해 받아올 날짜의 요일을 구하기 위한 준비물을 챙긴뒤 코드를 작성했다.

public class turtles13 {
    public String solution(int a, int b) {
        String answer = "";
        int[] day = {31,29,31,30,31,30,31,31,30,31,30,31};
        int month = 0;
        int today = 0;
        for (int i = 0; i < a-1; i++) {
            month += day[i];
        }
        today = month + b;
        switch(today%7){
            case 0:
                return "THU";
            case 1:
                return "FRI";
            case 2:
                return "SAT";
            case 3:
                return "SUN";
            case 4:
                return "MON";
            case 5:
                return "TUE";
            case 6:
                return "WED";
        }
        return answer;
    }
}

장장 4시간 동안 끈기있게 매달려 얻은 결과물치고 허무했다. 좀 더 일찍 생각을 했더라면 쉽게 풀리는 문제였을텐데 앞으로 달력문제는 까먹지 않을 것 같다.

여담으로 프로그래머스에는 다른 사람들의 풀이를 볼 수 있는데 위에 언급했던 두 번째 방법으로 푸신 분이 계시더라..

스크린 한 장면에 코드의 10분의 1도 담지 못하는 풀이를 보고 있자니 저 분의 끈기와 집념에 경외심이 들었다.

profile
공부하는 백엔드 개발자

0개의 댓글