Notice
Recent Posts
Recent Comments
Link
관리 메뉴

윤일무이

[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 2016년 본문

⚙️ 코딩테스트

[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 2016년

썸머몽 2023. 6. 1. 23:58
728x90

📌  문제

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일같은 날짜는 주어지지 않습니다)

📌  풀이

알아야 하는 것

  • toString() : 문자열로 반환한다.
  • arr.slice() :  arr.slice([begin[, end]])로 begin부터 end 앞까지 자른 배열 객체를 반환한다. 원본 배열을 훼손하지 않는다.
  • toUpperCase() : 대문자로 변환한다.
  • new Date()
    • const date1 = new Date('December 17, 1995 03:24:00'); // Sun Dec 17 1995 03:24:00 GMT...
    • new Date () 안에 연도, 월, 일, 시간, 분, 초, 밀리초 까지 작성할 수 있다.
    • 월의 경우 1월을 0으로, 12월을 11로 나타내니 주의한다.
    • getYear(), getMonth(), getDate(), getDay() - 요일 등을 구할 수 있다.

 

구할 것

  • 배열 month1stWeek에 2016년의 1, 2... 12월 1일의 요일을 담는다.
  • 배열 weekend에 한 주의 요일을 담는다.
  • 주어진 a월 b일의 요일을 구하기 위해 먼저 a월의 1일을 구한다.
    • a월의 1일 -> 해당 요일에 b일을 더해 b일일 때 요일을 구하고자 한다.
    • 배열 요소 기준으로는 1월부터 들어가 있기 때문에 month1stWeek([a-1])을 해야 진짜 해당 월의 1일을 구할 수 있음
  • a월의 1일 요일을 구한 후, weekend에 같은 요일을 찾는다.
    • 그 요일을 기준으로 b-1을 더해준다. 1일부터 b일까지 계산하는 거라 1을 빼줘야 진짜 해당 월의 해당 일을 구할 수 있음
  • 그렇게 구한 해당 월의 해당 일이 6보다 크면 weekend를 벗어나기 때문에 % 7로 나머지를 계산해준다.
function solution(a, b) {
  let month1stWeek = [
    "FRI",
    "MON",
    "TUE",
    "FRI",
    "SUN",
    "WED",
    "FRI",
    "MON",
    "THU",
    "SAT",
    "TUE",
    "THU",
  ]; //각 월의 1일 요일
  let weekend = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"];

  let matchWeek = weekend.indexOf(month1stWeek[a - 1]) + ((b - 1));
  return weekend[matchWeek % 7];
}

예를 들어 a = 5, b = 24일 경우 5월 1일의 요일은 month1stWeek[a-1]로 "SUN"이다.

5월 24일의 요일을 구하려면 1일부터 24일까지 총 23일이 필요하므로 b-1를 더해준다.

weekend.indexOf(month1stWeek[4] == SUN) 는 weekend에서 0번 인덱스다.

여기에 23을 더해주었으니 matchWeek는 23으로, 6이상을 고려할 때 weekend.length를 나눈 인덱스를 리턴하면 된다.

 

a월의 1일의 요일 찾기 -> 그 요일이 실제 요일 배열에 몇 번째 인덱스인지 찾고 + (b-1)일 더해주기 -> 해당 값을 7요일로 나눠 주기

 

📌  또 다른 풀이

function solution(a, b) {
    let day = new Date(2016, a-1, b)
    return day.toString().slice(0, 3).toUpperCase()
}

Date 생성자를 사용하면 이렇게 풀 수 있다.

2016년의 a월 b일의 날짜를 구한다.

특정 년도, 월, 일을 날짜로 구현하면 요일부터 월, 일, 년도, 시간이 나오는데 이를 문자열로 바꿨을 때 0번째 인덱스부터 2번째 인덱스까지가 요일을 나타낸다.

따라서 slice로 0부터 3번 앞까지를 잘라내고, 대문자로 변환해주면 되는 문제였다.

 

 

728x90