📌 문제
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번 앞까지를 잘라내고, 대문자로 변환해주면 되는 문제였다.
'⚙️ 코딩테스트' 카테고리의 다른 글
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 과일 장수 (0) | 2023.06.06 |
---|---|
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 문자열 나누기 (0) | 2023.06.05 |
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 가장 가까운 글자 (0) | 2023.06.01 |
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 모의고사 (0) | 2023.05.31 |
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 완주하지 못한 선수 (0) | 2023.05.30 |