Post

자바스크립트 코딩테스트 예제: 유지비 청구 날짜 구하기

자바스크립트 코딩테스트 예제: 유지비 청구 날짜 구하기

문제

유지비는 매달 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] 입니다.

 

풀이 (자바스크립트)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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() 등의 날짜 함수를 사용하지 않고 수동으로 구현하면 됩니다.

sumOfDay는 1부터 시작하며, 요일 정보는 0(월요일)으로 시작하므로 1만큼 차이가 발생합니다. 이 차이를 조정하기 위해 -1을 하는 것입니다.

 

This post is licensed under CC BY 4.0 by the author.