본문 바로가기
Algorithms & CS

[JAVA] 프로그래머스 - 2016년

by 고막고막 2019. 7. 15.

문제 설명

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

나의 솔루션

import java.util.Arrays;

public class Solution {
	public static String solution(int a, int b) {

		// 요일 배열에 요일 담기
		String[] year = new String[366];
		String[] week = { "FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU" };

		int i = 0;
		while (i < year.length) {
			for (int j = 0; j < week.length; j++) {
				if (i == 366)
					break;
				year[i] = week[j];
				i++;
			}
		}

		// 몇번째 날짜인지 계산해서 요일 배열에서 확인
		int inputDate = 0;
		int[] date = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
		a = a - 1;
		for (int j = 0; j < a; j++)
			inputDate += date[j];
		inputDate += b;
		return year[inputDate - 1];
	}
}

개선한 코드

/*copyright© 2019. mh. All rights reserved.*/
class Solution{
	public static String solution2(int a, int b) {
	      // 요일 배열에 요일 담기
	      String[] day_of_week = {"FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"};
	      int[] day_of_month = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	      int answer_day_point = 0;

	      // 몇번째 날짜인지 계산해서 요일 배열에서 확인 월(a), 일(b)
	      a = a -1;
	      for(int i = 0; i < a; i++) {
	         answer_day_point += day_of_month[i];
	      }
	      answer_day_point += (b-1);
	      return day_of_week[answer_day_point%7];
	   }
}

- 전체 요일을 배열에 담으면 성능이 떨어짐
- 날짜들을 일렬로 나열했을 때 7로 나눈 나머지는 항상 0~6이라는 규칙을 찾아 요일 배열과 맵핑

다른 사람 풀이

class Solution{
    public String getDayName(int a, int b)
    {
        String answer = "";
        int daySum = 0;
        int day;
        String[] myday = {"FRI", "SAT", "SUN", "MON", "TUE", "WED" ,"THU"};
        for(int i=1; i<a; i++){
            if(i == 2){
            daySum += 29;
          } else if(i==4 || i==6 || i==9 || i==11){
            daySum += 30;
          } else{
            daySum += 31;
          }
        }
        daySum += b - 1;
        day = daySum % 7;

        return answer = myday[day];
    }
}

- 처음 구상했던 월별 if~else문을 이용한 로직. for문을 돌면서 값을 계속 누적해주면 된다. 이하동문.