문제 출처 : 2016년
주어진 입출력과 문제에 나와있는 규칙을 바탕으로 관찰을 해보면 특정 요일을 구하기 위해선 먼저 총 일수을 구해한다. 예를 들어 a = 2, b= 12일 이라면 1월에 전체 일수와 b를 더하면 총 43일이라는 숫자가 나오고 이 수를 다시 7로 나눴을 때 나머지가 1이 나오게 되는데 이 나머지로 나온 수가 해당 요일을 가리키게 된다.
여기까지만 생각했다고 해서 바로 코딩하게 된다면 문제를 틀릴 가능성이 높다.
한가지 중요한 사실은 나머지로 나온 숫자와 요일을 어떤 방식으로 매칭을 할 것이냐?
라는 문제가 아직 남아있다.
문제에 나와있듯이 1월 1일은 금요일이다. 이를 순서대로 1월 6일 목요일까지 해당되는 일을 7로 나눈 나머지를 구해보면 아래와 같은 표로 나타낼 수 있다.
0 - 금요일
1 - 토요일
2 - 일요일
3 - 월요일
4 - 화요일
5 - 수요일
6 - 목요일
이를 바탕으로 생각나는대로 코드를 작성해봤다.
class Solution {
public String solution(int a, int b) {
String answer = "";
int totalDay = 0;
// 이 부분에서 원소의 갯수가 13개였음,,
int[] days = {31, 29, 31, 30, 31, 30, 31, 31, 31, 30, 31, 30, 31};
for (int i = 0; i < a - 1; i++) {
totalDay += days[i];
}
totalDay += (b - 1);
switch (totalDay % 7) {
case 0:
answer = "FRI";
break;
case 1:
answer = "SAT";
break;
case 2:
answer = "SUN";
break;
case 3:
answer = "MON";
break;
case 4:
answer = "TUE";
break;
case 5:
answer = "WED";
break;
case 6:
answer = "THU";
break;
}
return answer;
}
}
위와 같은 코드를 작성한 후 제출을 시도하면 테스트 케이스 3번과 14번을 실패하게 된다.
조심스럽게 마지막 요일을 정의해놓은 배열의 갯수가 12개인 상태여야하지만, 13개인 상태였다..한마디로 오타였다,,🥹
int[] days = {31, 29, 31, 30, 31, 30, 31, 31, 31, 30, 31, 30, 31};
오타도 발견한 겸, 소스를 조금이나마 개선해보고 싶어 리펙토링을 진행했고 최종 결과물은 아래와 같다.
class Solution {
public String solution(int a, int b) {
int totalDay = 0;
String[] weekday = {"FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"};
int[] finalDays = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// for문을 돌려 a-1까지 date 배열에 있는 값을 totalDay 변수에 더해준다.(7월이라면 6월까지는 다 더하는 것)
for (int i = 0; i < a - 1; i++) {
totalDay += finalDays[i];
}
// b-1를 해주는 이유는 해당 요일이 지난 일이 아니기 때문이다.
// b-1을 해주지 않는다면 day[select]는 day [1]이 되어 버리고 그러면 1월 1일은 금요일인데 SAT가 나오게 된다.
totalDay += (b - 1);
return weekday[totalDay % 7];
}
}