728x90
반응형
Programmers LV1. 2017년
문제 설명
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일같은 날짜는 주어지지 않습니다)
입출력 예
a | b | result |
5 | 24 | "TUE" |
사용 언어
Java
해결 방법
1. Calendar API 이용
2. 계산법 이용 (2016년 1월 1일 금요일 기준) --> 내가 시도하던 방법
Calendar를 아래 코드 뿐만 아니라 더 다양한 메서드를 활용해서 적용할 수도 있긴 하다.
계산법은 아래 코드가 제일 쉽고 깔끔한 것 같다.
알게된 것
- Calendar API 메서드, 상수
- cal.getInstance() : 캘린더 셋팅 시 초기 인스턴스 생성해주어야 함.
- cal.set() / cal.get()
- Calendar.YEAR
Calendar.MONTH : 0=1월, 1=2월, 2=3월 ...
Calendar.DATE
Calendar.DAY_OF_WEEK : 현재 지정된 날짜의 요일. 1=일요일, 2=월요일 ...
❗ MONTH, DAY_OF_WEEK 는 반환 넘버와 실제 월/요일 매칭 주의하기
코드
public class test_12901 {
public static void main(String[] args) {
// System.out.println(solution(5, 24)); // TUE
System.out.println(solution2(5, 24));
}
// 1. Calendar API 이용
public static String solution(int a, int b) { // 2016년 a월, b일 -> 요일 리턴
String answer = "";
String[] DAY = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2016);
// 0:1월, 1:2월 ...
cal.set(Calendar.MONTH, a-1);
cal.set(Calendar.DATE, b);
// 1:일요일, 2:월요일 ...
int idx = cal.get(Calendar.DAY_OF_WEEK);
answer = DAY[idx-1];
return answer;
}
// 2. 계산법 이용
public static String solution2(int a, int b) {
// 2016. 1. 1 -> FRI
String answer = "";
int[] MONTH_PLUS = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 2016년 2월은 윤달이라 29일
String[] DAY = {"FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"};
int sum = 0;
for(int i = 0; i<a-1; i++) {
sum += MONTH_PLUS[i];
}
sum += (b-1);
answer = DAY[sum%7];
return answer;
}
}
Calendar API 처럼 날짜 다루는 건 필요할 때 찾고 복붙하게 되어서 바로 이거 써야지 생각하기가 쉽지 않았다. 꼭 2번 방법이 아니어도 java를 활용한다면 저런 라이브러리를 쓸 수도 있겠다는 생각이 들었다. 알고리즘 문제로서 요구하는건 계산법이겠지만!ㅎ 나는 2번 방법으로 접근했고 비슷하게 생각, 구현까지는 했는데 재대로 값이 안나와서 계속 해맸다. 2월을 28로 해놓고 안된다고 하고있으니 참 ㅎㅠ 코드는 비슷했고 가장 깔끔한 코드 찾아서 재적용해보았다. 캘린더 API 도 자주 다뤄봐야할 것 같다.
728x90
반응형
'알고리즘' 카테고리의 다른 글
[알고리즘/Programmers] LV1. 가운데 글자 가져오기 (0) | 2021.04.13 |
---|---|
[알고리즘/Programmers] LV1. k번째 수 (0) | 2021.04.11 |
[알고리즘/Programmers] LV1. 완주하지 못한 선수 (0) | 2021.04.07 |
[알고리즘/Programmers] LV1. 두 개 뽑아서 더하기 (0) | 2021.04.05 |
[알고리즘/인프런정리] 2-2. Recursion의 응용: Counting cell in a Blob (0) | 2020.10.05 |