본문 바로가기
코딩테스트

(javaScript) 2016년

by 어뇨 2024. 2. 18.

 

function solution(a, b) {    
    const dayOfTheWeek = ["SUN","MON","TUE","WED","THU","FRI","SAT"]
    const dayOfTheMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    let day = b+4;
    for(let i = 0 ; i < a-1 ; i++){
        day += dayOfTheMonth[i]
    }
    return dayOfTheWeek[day%7];
}

 

new Date()를 사용하면 현재날짜를 불러올수있는건 아는데 2016년의 날은 어떻게 할지 몰라서 주먹구구식으로 풀었다.

우선 문제를 보면 2016년 1월 1일은 금요일이고 요일을 반환할땐

["SUN","MON","TUE","WED","THU","FRI","SAT"]

 이런식으로 하게끔했다.

각 월의 마지막날을 어떻게 구해야할지 막막했는데 도저히 생각이 안나서 하나하나 마지막날을 적었고 

let day = b + 4 는 1월 1일은 금요일이기 떄문에 day b의 값이 1이 주어지면 5번째 인덱스 즉 "FRI"을 리턴할수있게끔 설정해놨다.

그리고 반복문을 통해 day에 각 월의 마지막 날짜를 더해주면 된다. 예를들어 6월 17일이라면 day의 값은 17+4 21이 됐고,

i가 a-1만큼 돌기때문에 0번째 인덱스값부터 4번째인덱스의 값 즉 31, 29 ,31 ,30 ,31 을 day에 더 해준다.

즉 day의 값은 173이고, 173을 7로 나눈 나머지 값을 dayOfTheWeek의 인덱스 값으로 쓰면 답이 나온다.

 

여기서 문제점은 해가 바뀔때마다 day의 초기값도 바뀌어야하고 dayOfTheMonth의 1번째 인덱스값도 바뀌어야 하기 때문에 문제가 있다 라고할수있다.

 

다른사람의 풀이

function getDayName(a,b){
    var tempDate = new Date(2016, a-1, b);

    return tempDate.toString().slice(0,3).toUpperCase();
}

이거다 new Date를 쓰는 방법인데 

new Date(2016, a-1, b)는 첫 매게변수 순서대로 year, monthIndex, day라고한다. 여기서 monthIndex는 0부터 시작하므로(0이 1월, 11이 12월) a-1을 뒀다. 

이 다음부분을 어떻게 해야할지몰랐는데 문자열로 바꾸면 Tue May 24 2016 00:00:00 GMT+0900 (Korean Standard Time) 이런식으로 나타난다. 그럼 우리가 원하는건 이 문자열에서 Tue 요일 부분이기때문에 slice메서드를 이용해서 3글자를 잘라내고 그리고 문제에서 요일을 대문자로 리턴하라고 했기때문에 toUpperCase()를 사용해서 대문자로 바꿔주면 된다.

 

'코딩테스트' 카테고리의 다른 글

(javascript) 과일장수  (0) 2024.02.22
(javaScript) 카드뭉치  (0) 2024.02.19
(javaScript) 명예의전당(1)  (0) 2024.02.16
(javaScript) 가장 가까운 같은 글자  (0) 2024.02.13
(javascript) K번째수  (0) 2024.02.07