Intro

이 문제를 푸는 가장 쉬운 방법은 Calendar 클래스를 사용하는  것 입니다. 하지만 개인적인 생각으로는 본 문제의 의도는 Calendar 클래스를 이용하는 것이 아닌, 스스로 로직을 만들어서 해결하는 것이라고 생각하여 Calendar 클래스를 사용하지 않고 해결하였습니다.

문제

힌트

  • 기준이 되는 2016년의 1월 1일은 금요일입니다.
  • 2016년은 윤년이고 2월은 29일까지 존재합니다.
  • 만약, 금요일 = 5라고 한다면 일요일~토요일은 각각 0,1,2,3,4,5,6입니다.
  • 1월 1일= 5이므로 그로부터 14일이 지난 1월 15일=19 입니다.
  • 요일 = (5 + 지난일수) % 7

풀이

	public String solution(int a, int b) {
        String answer = "";
        boolean is31Days = true; // 현재가 31일까지 있는지 30일까지 있는지를 판별하기 위한 flag. 1월은 31일까지 있다.
        int days = 5; // 2016.01.01.은 금요일

        for(int i = 1; i <= a; i++) { // 1월부터 a월까지 반복한다
            if(i != a && is31Days) { // 목표월이 아니고 31일까지 있는 달의 경우
                days += 31; // 31일을 추가한다
                if(i != 7) is31Days = false; // 7월 다음의 8월도 31일이므로 7월이 아닐때에만 31일 관련 플래그를 변경해준다.
            } else if(i != a && is31Days == false) { // 목표월이 아니고 31일까지 있는 달의 경우
                if(i == 2) days += 29; // 2016년의 2월은 윤년으로써 29일까지 있었다.
                else days += 30; // 그외에는 30일을 더해준다.
                is31Days = true; // 30일인 달의 다음달은 반드시 31일이다.
            }
        }
        days += b - 1; // b를 그대로 더하면 2016.01.01은 토요일이 되므로 1을 빼준다. (반복문때문에)
        answer = getDay(days % 7); // 7을 나눈 나머지를 인수로 보내 요일을 판별한다.

        return answer;
    }
    
    public String getDay(int date){
        //0일 1월 2화 3수 4목 5금 6토
        switch(date){
            case 0: return "SUN";
            case 1: return "MON";
            case 2: return "TUE";
            case 3: return "WED";
            case 4: return "THU";
            case 5: return "FRI";
            default: return "SAT";
        }
    }
출처

프로그래머스-lv1-2016년

0개의 댓글