문제

유지비는 매달 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을 하는 것입니다.)

 

문제 출처 – 프로그래머스

문의 | 코멘트 또는 yoonbumtae@gmail.com


카테고리: 코딩테스트


0개의 댓글

답글 남기기

Avatar placeholder

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다