문제
유지비는 매달 k
일에 청구됩니다. 그 날이 주말(토요일 & 일요일)이라면, 유지비는 제일 가까운 주말에 청구됩니다. 1월(매 연도의 첫 달)의 첫째 주 첫 날의 요일이 day
로 주어지며, k
는 매달 유지비를 지불해야 하는 날짜일 때 이러한 파라미터를 받아 1월부터 12월까지 k가 주말이면 0, 아니라면 1을 반환하는 배열을 반환하는 solution
함수를 작성하세요.
제약
- 1월 첫째주의 날짜는 다음과 같이 주어집니다.
- 월요일: 0, 화요일: 1, 수요일: 2, 목요일: 3, 금요일: 4, 토요일 5, 일요일 6
k
는 1과 28 사이의 자연수입니다.- 각 달의 일수는 [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 입니다. 윤년 및 휴일은 고려하지 않습니다.
테스트 케이스
- #1 -> day = 6, k = 1, result = [1,0,0,1,0,0,1,0,0,1,0,0]
- #2 -> day = 6, k = 25, result = [0,1,1,0,0,1,0,0,0,0,1,0]
예제 #1
첫 번째 day
는 일요일(6)이며, 유지비는 매월 1일(k
)에 청구되어야 합니다. 1월의 1일이 주말이므로, result
의 첫 번째 요소의 값은 1입니다. 1월부터 12월까지 매 달의 1일의 요일은 다음과 같습니다.
- 1월 – 일요일
- 2월 – 수요일
- 3월 – 수요일
- 4월 – 토요일
- 5월 – 월요일
- 6월 – 목요일
- 7월 – 토요일
- 8월 – 화요일
- 9월 – 금요일
- 10월 – 일요일
- 11월 – 수요일
- 12월 – 금요일
따라서 반환 배열은 [1,0,0,1,0,0,1,0,0,1,0,0]
입니다.
예제 #2
첫 번째 day
는 일요일(6)이며, 유지비는 매월 25일(k
)에 청구되어야 합니다. 1월의 25일이 주말이 아니므로, result의 첫 번째 요소의 값은 0입니다. 1월부터 12월까지 매 달의 25일은 수, 토, 토, 화, 목, 일, 화, 금, 월, 수, 토, 일입니다. 따라서 반환 배열은 [0,1,1,0,0,1,0,0,0,0,1,0]
입니다.
풀이 (자바스크립트)
function solution(day, k) { let answer = [] const MONTHS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] // month 증가시 일수 누적 let sumOfDay = 0 // 1월부터 12월까지 순회 for(let i = 0, len = MONTHS.length; i < len; i++) { // 1월인 경우(else) day + k 더한 값에 1 빼기 -> 나머지를 통해 요일을 구하기 위함 // 예: day = 6(일요일), k = 1인 경우 6 + 1 - 1 = 6 // 예: day = 6(일요일), k = 1인 경우 6 + 25 - 1 = 30 if(i != 0) sumOfDay += MONTHS[i - 1] else sumOfDay = day + k - 1 // 누적 일수를 7로 나눈 나머지가 해당 달 지급일의 요일 let currentDay = sumOfDay % 7 // 토, 일이면 1 push, 아니면 0 push if(currentDay == 5 || currentDay == 6) answer.push(1) else answer.push(0) } return answer }
이 문제는 요일 구하기 문제이지만 Date()
등을 사용해서는 안됩니다. 이 문제에서 나오는 날짜 정보들은 현실의 요일이 아니라 실존하지 않는 가상의 주어진 날짜를 사용하기 때문입니다. 따라서 Date()
등의 날짜 함수를 사용하지 않고 만든 다음 구현하면 됩니다.
1월의 누적 요일을 계산할 때 sumOfDay = day + k - 1
에서 왜 -1
을 하는지는 잘 모르겠습니다. 첫 번째 테스트 케이스에서 1일은 일요일이 나와야 하는데 -1
을 하지 않으면 (6 + 1) % 7 = 1
이 되어 일요일이 아닌 월요일이 되는 오류 현상이 일어나는 것은 발견했습니다. 혹시나 해서 사용해 봤는데 정답 처리가 되었습니다. 이를 통해 앞으로 계산이 잘 안된다 싶은 곳에 -1
을 사용하면 도움이 될 수 있다는 것을 알았습니다.
(추가: sumOfDay
는 1부터 시작하며, 요일 정보는 0
(월요일)으로 시작하므로 1만큼 차이가 발생하며, 이 차이를 조정하기 위해 -1
을 하는 것입니다.)
문제 출처 – 프로그래머스
0개의 댓글