프로그래머스-2016년
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));