문제
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일같은 날짜는 주어지지 않습니다)
- 출력 예시 -
정답 코드
< 내 정답 코드 >
class Solution {
public String solution(int a, int b) {
int totalOfDays = b;
int[] month = {31, 29, 31, 30, 31 ,30, 31, 31, 30, 31, 30, 31};
String[] DayOfWeek = {"THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"}; // 목요일부터 시작하자!!
for (int i = 0; i < a - 1; i++) {
totalOfDays += month[i];
}
return DayOfWeek[totalOfDays % 7];
}
}
< 리팩터링 이후 코드 >
public static String solution(int a, int b) {
int totalDays = calculateTotalDays(a, b);
return getDayOfWeek(totalDays);
}
private static int calculateTotalDays(int a, int b) {
int[] month = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int totalMonthDays = 0;
for (int i = 0; i < a - 1; i++) {
totalMonthDays += month[i];
}
return totalMonthDays + b;
}
private static String getDayOfWeek(int totalDays) {
String[] dayOfWeek = {"THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"};
return dayOfWeek[totalDays % 7];
}
이것을 주의하자!
- 요일은 7을 기점으로 무한 반복하니깐 1월 1일부터 시작해 총 몇 일이 지났는지를 계산한다면 해당 값에 7을 나누어 나머지 값을 통해 정답을 구할 수 있다. 이를 위해 month [ ] 배열과 DayOfWeek [ ] 배열을 만들었다.
- 주의할 점은, 만약 5월 16일을 구하고 싶다면, 그 직전 달의 모든 일수(4월 까지)와 나머지 16일을 더해야 한다. 5월이라고 해서 1, 2, 3, 4, 5월의 전체 일수를 모두 더하면 안된다. 따라서 for 문의 조건식에서 ' a - 1 ' 을 통해 해당 월의 직전 달까지만 더하겠다고 해야 한다!
- 또 마지막 요일 배열의 원소를 찾을 때도 주의해야 한다. 만약 배열의 시작이 "FRI" 금요일일 경우, 7로 나눈 값의 나머지는 배열의 목표 인덱스보다 1 이 많다. 그래서 ' DayOfWeek [ totalOfDays % 7 - 1 ] ' 처럼 - 1을 해줘야 한다. 그러나 totalOfDays % 7 의 값이 0이 되는 경우엔 DayOfWeek [ - 1 ] 이 되어 버려서 예외가 발생하게 된다. 이를 해결하려면 아예 - 1을 하지 않도록 빼고, 금요일이 아닌 "THU" 목요일부터 시작하도록 배열을 만들어야 한다.
'코딩 테스트' 카테고리의 다른 글
[프로그래머스] (Lv.1) 예산 (0) | 2022.09.04 |
---|---|
[프로그래머스] (Lv.1) 두 개 뽑아서 더하기 (0) | 2022.09.04 |
[프로그래머스] (Lv.1) 나머지가 1이 되는 수 찾기 (0) | 2022.09.04 |
[프로그래머스] (Lv.1) 부족한 금액 계산하기 * (0) | 2022.09.04 |
[프로그래머스] (Lv.1) 비밀지도 ** (0) | 2022.09.02 |