문홍의 공부장

[Java] 프로그래머스 Lv1. 2016년 풀이 본문

알고리즘/프로그래머스

[Java] 프로그래머스 Lv1. 2016년 풀이

moonong 2020. 1. 27. 17:58
반응형

문제 설명

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

나의 풀이

얼마 전에 DateFormat 클래스에 대한 내용을 복습했기 때문에, 자연스레 Calendar 클래스를 활용해야겠다는 생각이 들었다.

1
2
3
4
5
6
7
8
9
10
public String solution(int a, int b) {
    String answer = "";
    Calendar cal = Calendar.getInstance();
    cal.set(2016, a-1, b);
    Date date = cal.getTime();
    SimpleDateFormat sdf = new SimpleDateFormat("E", Locale.ENGLISH);
          
    answer = sdf.format(date).toUpperCase();
    return answer;
}
cs

다른 사람의 풀이

Calendar 클래스를 활용한 풀이
캘린더 클래스의 함수를 이용하여 코드를 보다 짧게 만들 수 있었다.
나의 경우 이 함수를 몰라서 Calendar 클래스를 Date 클래스로 파싱하고, 또 SimpleDateFormat 클래스를 이용하여 요일 값을 뽑아오느라 여러 개의 클래스를 import 해와야 했는데, 아래 풀이를 보니 더 간결하고 깔끔하게 문제를 해결할 수 있었다.

1
2
3
4
 public String getDayName(int month, int day) {
    Calendar cal = new Calendar.Builder().setCalendarType("iso8601").setDate(2016, month - 1, day).build();
    return cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.SHORT, new Locale("ko-KR")).toUpperCase();
}
cs



배열을 이용한 풀이
만년달력형 문제가 아니라, 2016년에 한정하여 문제를 냈기 때문에 배열로 설정하여 해결하는 것도 효율적으로 보인다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public String getDayName(int a, int b) {
     String answer = "";
     String[] day = { "FRI""SAT""SUN""MON""TUE""WED""THU" };
     int[] date = { 312931303130313130313031 };
     int allDate = 0;
     for (int i = 0; i < a - 1; i++) {
        allDate += date[i];
     }
 
     allDate += (b - 1);
     answer = day[allDate % 7];
 
     return answer;
}
cs
반응형