문제
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일같은 날짜는 주어지지 않습니다)
나의 답
이거 정말 짜증났던게, 아래 days 배열의 시작 요일을 금요일로 하고, return 할때, days 배열의 인덱스값에 -1을 해줬는데, 프로그래머스에서 채점을 하면 테스트 케이스 중 2개가 계속 틀린 것으로 나왔다.
그래서 질문하기를 통해 보니, 나와 같은 케이스의 분이 시작 요일을 변경해서 채점하면 통과한다고 글을 올려두어서 그대로 했더니 +10으로 통과가 되었다...
맞는 답을 틀리다고 해서 나의 소중한 시간을 많이 뺏겼다..ㅠㅠ
로직은 간단하다.
일자를 7로 나눴을 때 나머지 값으로 요일을 메겨주면 된다.
2016년 1월 1은 금요일이므로, [금, 토, 일, 월, 화, 수, 목] 의 순서로 요일 배열을 만들어 준다.
그리고 월마다 끝나는 일자가 다르므로, 이것도 배열을 만들어, 입력받은 달의 앞전 달까지의 총 일자를 더해준다.
1월 1일 : 1+0 %7 == 1 -> 금요일
2월 29일 : (29+ 31) % 7 == 4 -> 월요일
function findDays(a, b) {
const days = ["THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"];
const month = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
let addDays = 0;
for (i = 0; i < a; i++) {
addDays += month[i];
}
return days[(b + addDays) % 7];
}
솔직히, 다른 사람의 답을 보면 정말 많은 사람들이 메서드와 객체를 사용해서 문제를 푸는데, 그게 알고리즘 문제를 푸는 것이 맞는지 의문이 들긴 한다. 하지만, 현업에서 개발하기 위해서는 내장 객체를 잘 사용해야겠지... 그렇게 문제를 해결해 나가는 연습을 하는게 훨씬 더 실용적이겠지 하는 생각이 들기도 한다.
만약 위의 코드에 연도까지 입력을 받고 싶다면,
서기 1년 1월 1일이 월요일이고, 윤년(4년에 한번씩 1일이 더 생김)을 계산해서 1.1.1부터 입력받는 날짜까지의 총 일수를 받아 7로 나눈 나머지 값을 넣어주면 되겠다.
'항해99_10기 > [2주차] 알고리즘 문제풀이' 카테고리의 다른 글
| [11번][연습문제][Lv.1] 콜라츠 추측 (0) | 2022.11.19 |
|---|---|
| [10번][연습문제][Lv.1] 제일 작은 수 제거하기 (0) | 2022.11.19 |
| [4번][연습문제][Lv.1] 완주하지 못한 선수 (0) | 2022.11.19 |
| [3번][연습문제[Lv.1] 수박수박수박수박수박수? (0) | 2022.11.19 |
| [2번][연습문제][Lv.1] 나누어 떨어지는 숫자 배열 (0) | 2022.11.19 |