일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
- 자바스크립트 날씨 웹 만들기
- reactnativecli
- 프로그래머스
- HTML
- 자바스크립트 sort()
- [파이썬 실습] 중급 문제
- 엘리스 AI 트랙 5기
- [파이썬 실습] 심화 문제
- 개발일기
- [AI 5기] 연습 문제집
- 부트캠프
- 프론트개발
- 자바스크립트
- 리트코드
- 삼항연산자
- 자바스크립트 split()
- 날씨 웹 만들기
- 개발공부
- [파이썬 실습] 기초 문제
- JavaScript
- 코딩부트캠프
- RN 프로젝트
- 프론트개발공부
- leetcode
- 간단한 날씨 웹 만들기
- 자바스크립트 날씨
- 코드스테이츠
- 자바스크립트 reduce()
- 엘리스 ai 트랙
- 엘리스
- Today
- Total
개발조각
[프로그래머스] 2016년 본문
2021.11.05에 푼 문제입니다.
프로그래머스 문제를 일주일에 하나씩 풀다 보니까 진도가 못 나가는 기분이 들어서 이제는 틈만 나면 풀려고요!!😤
이번에는 2016년 문제를 풀었는데요. 이번 문제는 단순하게 생각하면 정말 쉬운 문제인 것 같아서 저도 빠르게 풀었어요.
이 문제를 해결하기 전에 윤년이 뭔지 살펴보면
일반적으로 2월은 28일까지 있는데
윤년은 4년마다 한 번씩 2월이 28일이 아닌 29일까지 있는 날입니다.
2016년에 1월~12월까지 한 달에 며칠이 있는지 차례대로 배열에 담으면
[31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
이렇게 됩니다.
이문제는 요일을 구하는 문제이기 때문에 일주일은 7일이라는 점이 중요한데요.
1월 1일이 금요일이고 +7일마다 같은 요일로 돌아옵니다.
- 1월 1일 금요일
- 1월 8일 금요일
- 1월 15일 금요일
- 1월 22일 금요일
- 1월 29일 금요일
1월에 금요일인 날만 쯕 써보았는데요.
이 숫자를 쭉 보시면 "(7* n) + 1 = 금요일"이라는 공식이 보이게 됩니다.
이 공식이 이 문제에 해결방안의 키포인트입니다.
그럼 a월 b일이 며칠이나 되는지 계산하고 7로 나누어 나머지수가 몇 개인지 알아내고 나머지수가 몇 개냐에 따라 요일을 세서 무슨 요일인지 알아내면 되겠죠?
5월 24일은 무슨 요일?
5월 24일의 일 수
- 1월 + 2월 + 3월 + 4월 + 24일 = 31일 + 29일 + 31일 + 30일 + 24일 = 145일
5월 24일의 일 수 % 7
- (145) % 7 = 5
금-> 토-> 일-> 월-> 화요일
- 2016년 1월 1일은 금요일입니다.
- 2016년은 윤년
- 1월부터 12월까지 한 달에 며칠 있는지
- (7* n) + 1 = 금요일
그럼 이 4가지 정보를 가지고 아래 해결방안 설명에서 자세히 설명해보겠습니다.
해결방안
function solution(a, b) {
let mDArr = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
let dW = ['FRI','SAT', 'SUN', 'MON','TUE','WED','THU'];
let sum = 0;
for(let i=0; i<a-1; i++){
sum += mDArr[i];
}
sum = (sum + b - 1) % 7;
return dW[sum];
}
해결방안 순서
- 1월 ~ 12월 일 수를 배열에 넣기, 금요일 ~ 목요일 배열에 넣기
- a-1월까지의 일 수 구하기
- 최종 일 수 구한 뒤 요일 구하기
1단계. 1월 ~ 12월 일 수를 배열에 넣기, 금요일 ~ 목요일 배열에 넣기
//1단계
// 1월부터 12월까지의 일 수 넣기
let mDArr = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
// 금요일 부터 목용일 까지 넣기
let dW = ['FRI','SAT', 'SUN', 'MON','TUE','WED','THU'];
- mDArr : a월 b일이 며칠인지를 구하기 쉽게 하기 위해 한 달에 며칠이 있는지를 mDArr배열에 담았습니다.
- dW :1월 1일이 금요일이 이고, 뒤에 요일을 계산하기 쉽게 하기 위해 금~목까지 dW배열에 담았습니다.
2단계. a-1월까지의 일 수 구하기
// 2단계. a-1월 까지의 일 수 구하기
let sum = 0;
for(let i=0; i<a-1; i++){
sum += mDArr[i];
}
- sum : 1월 ~a-1월 며칠인지 담을 변수
- for(let i=0; i<a-1; i++) : a=5이면 0, 1, 2, 3까지 반복 -> 배열은 0부터 시작되기 때문에 a-1을 넣어주었습니다.
- sum += mDArr[i]; : 1월 + 2월 + 3월 + 4월 = 31일 + 29일 + 31일 + 30일 = 121일
3단계. 최종 일 수 구한 뒤 요일 구하기
// 3단계. 최종 일 수 구한 뒤 요일 구하기
sum = (sum + b - 1) % 7;
return dW[sum];
- sum + b : a월 b일의 최종 일 수
- sum = (sum + b - 1) % 7; : 여기서 -1를 해주는 이유는 배열은 0부터 시작하기 때문에 -1을 해주었습니다.
테스트 1(5월 24일)
1단계에서 1월~4월까지 121일이 나옴
sum + b = 121+24 = 145일
sum = (sum + b - 1) % 7; -> sum = (145 - 1) % 7; -> sum = 144 % 7; -> 4
dW[sum]; -> dW[4]; -> "TUE"
여기까지 프로그래머스 2016년 해결방안에 대해 설명해보았습니다.
Date()를 쓴 분들도 있는데 뭔가 편법? 같아서 안 썼습니다.
'알고리즘🅰 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 부족한 금액 계산하기 (0) | 2022.02.15 |
---|---|
[프로그래머스] 최소직사각형 (0) | 2022.02.14 |
[프로그래머스] 3진법 뒤집기 (0) | 2022.02.11 |
[프로그래머스] 소수 만들기 (0) | 2022.02.11 |
[프로그래머스] 실패율 (0) | 2022.02.11 |