본문 바로가기

코딩 테스트

[프로그래머스] (Lv.1) 2016년

728x90

문제


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일같은 날짜는 주어지지 않습니다)

 

 

-  출력 예시  -

정답 코드


<  내 정답 코드  >

class Solution {
    public String solution(int a, int b) {
        int totalOfDays = b;
        int[] month = {31, 29, 31, 30, 31 ,30, 31, 31, 30, 31, 30, 31};
        String[] DayOfWeek = {"THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"};  // 목요일부터 시작하자!!
        
        for (int i = 0; i < a - 1; i++) {
            totalOfDays += month[i];
        }
        
        return DayOfWeek[totalOfDays % 7];
    }
}

 

<  리팩터링 이후 코드  >

public static String solution(int a, int b) {
    int totalDays = calculateTotalDays(a, b);
    return getDayOfWeek(totalDays);
}

private static int calculateTotalDays(int a, int b) {
    int[] month = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int totalMonthDays = 0;
    for (int i = 0; i < a - 1; i++) {
        totalMonthDays += month[i];
    }
    return totalMonthDays + b;
}

private static String getDayOfWeek(int totalDays) {
    String[] dayOfWeek = {"THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"};
    return dayOfWeek[totalDays % 7];
}

 

이것을 주의하자!


-  요일은 7을 기점으로 무한 반복하니깐 1월 1일부터 시작해 총 몇 일이 지났는지를 계산한다면 해당 값에 7을 나누어 나머지 값을 통해 정답을 구할 수 있다. 이를 위해 month [ ] 배열과 DayOfWeek [ ] 배열을 만들었다. 

 

-  주의할 점은, 만약 5월 16일을 구하고 싶다면, 그 직전 달의 모든 일수(4월 까지)와 나머지 16일을 더해야 한다. 5월이라고 해서 1, 2, 3, 4, 5월의 전체 일수를 모두 더하면 안된다. 따라서 for 문의 조건식에서 ' a - 1 ' 을 통해 해당 월의 직전 달까지만 더하겠다고 해야 한다!

 

-  또 마지막 요일 배열의 원소를 찾을 때도 주의해야 한다. 만약 배열의 시작이 "FRI" 금요일일 경우, 7로 나눈 값의 나머지는 배열의 목표 인덱스보다 1 이 많다. 그래서 ' DayOfWeek [ totalOfDays  %  7  -  1 ] ' 처럼 - 1을 해줘야 한다. 그러나 totalOfDays  %  7 의 값이 0이 되는 경우엔 DayOfWeek [ -  1 ] 이 되어 버려서 예외가 발생하게 된다. 이를 해결하려면 아예 - 1을 하지 않도록 빼고, 금요일이 아닌 "THU" 목요일부터 시작하도록 배열을 만들어야 한다.