송민준의 개발노트

프로그래머스-2016년 본문

알고리즘

프로그래머스-2016년

송민준 2019. 10. 26. 21:10

https://programmers.co.kr/learn/courses/30/lessons/12901

 

코딩테스트 연습 - 2016년 | 프로그래머스

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일은 실제로 있는 날입니다.

programmers.co.kr

내가 짠 코드

import java.util.Calendar;
import java.util.GregorianCalendar;

class Solution {
  public String solution(int a, int b) {
      Calendar c = new GregorianCalendar(2016, a-1, b);
      String da[] = {"","SUN", "MON","TUE","WED", "THU", "FRI","SAT"};
      return da[c.get(Calendar.DAY_OF_WEEK)];
  }
}

참고할 코드(스터디원)

설명 : 2016년의 1월 1일은 금요일이다. String배열 day의 시작을 금요일로 설정.(~목)

배열date에는 각 월별 최대 일을 넣어준다.

그리고 구하고자 하는 달-1만큼 일수를 합치고 구하고자 하는 달의 일 수(b-1)를 마지막에 더해준다.

그리고 7로 나누면 해당 요일의 인덱스가 나온다.

ex) 나머지가 6이면 THU(목요일)

* 라이브러리를 쓰고 안쓰고에서 속도 차이가 있다.(안쓰는게 더 빠름)

 

참고할 코드(best)

public String solution(int a, int b) {
		Calendar c = new GregorianCalendar(2016, a-1, b);
		return c.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.SHORT, new Locale("ko-KR")).toUpperCase();
    }

더욱 참고할 코드

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();

 

사실 이 문제를 풀면서 달력 클래스의 메소드들이 기억이 잘 안났다-_- 블로그에서 주섬주섬 찾아가며 풀었다.

 

'달'에 -1을 해준 까닭은 캘린더에선 0이 1월달이라 그렇다.(기준이 그렇다는 뜻)

 

Calendar.DAY_OF_WEEK를 쓰면 숫자값이 반환이 된다. 일~토(0~7) 형식으로...

 

나는 String 배열을 통해 해당 값에 해당하는 문자열을 반환했지만 더욱 좋은게 있었다...

 

추가적으로 Locale은 한국 외 각 국가마다 표기하는 방법이 달라서 지역에 맞게 뽑아준단다... 참고하자!

 

+참고내용...

calendar는 추상 클래스다.

1. Calendar c - new Calendar(); 사용 불가능

2. 사용법 

- Calendar c1 = calendar.getInstance(); 정적 메소드 사용

- Calendar c2 = new GregorianCalendar(); 업캐스팅 방법

 

관련 메소드

Calendar today = Calendar.getInstance();

 

System.out.println("이 해의 년도 : " + today.get(Calendar.YEAR));

System.out.println("월(0~11, 0:1월) :" + today.get(Calendar.MONTH));

System.out.println("월(0~11, 0:1월) :" + (today.get(Calendar.MONTH)+1));

System.out.println("이 해의 몇 째 주 : " + today.get(Calendar.WEEK_OF_YEAR));

System.out.println("이 달의 몇 째 주 : " + today.get(Calendar.WEEK_OF_MONTH));

System.out.println("이 달의 며칠 : " + today.get(Calendar.DATE));

System.out.println("이 달의 며칠 : " + today.get(Calendar.DAY_OF_MONTH));

System.out.println("이 해의 며칠 : " + today.get(Calendar.DAY_OF_YEAR));

System.out.println("요일(1~7, 1:일요일): " + today.get(Calendar.DAY_OF_WEEK));

System.out.println("이 달의 몇번 째 요일 : " + today.get(Calendar.DAY_OF_WEEK_IN_MONTH));

System.out.println("오전_오후(0:오전, 1:오후):" + today.get(Calendar.AM_PM));

System.out.println("시간(0~11) : " + today.get(Calendar.HOUR));

System.out.println("시간(0~11) : " + today.get(Calendar.HOUR_OF_DAY));

System.out.println("분(0~59) : " + today.get(Calendar.MINUTE));

System.out.println("초(0~59) : " + today.get(Calendar.SECOND));