https://programmers.co.kr/learn/courses/30/lessons/12901
1. 문제에 대한 이해
- 우리가 풀어야 할 문제는 무엇인가?
- 2016년 a월 b일이 무슨 요일인가? - 주어진 자료는 무엇인가?
- 월 = a
- 일 = b - 조건은 무엇인가?
- 윤년 (2월29일까지 있음)
- 13월 26일이나 2월 45일같은 날짜는 주어지지 않는다
- 2016년 1월 1일은 금요일이다.
2. 계획
- 이 문제를 푸는데 있어서 유용하게 쓸 수 있는 지식은 무엇인가?
- reduce
- 요일 이름이 담긴 배열을 만든다. (Days)
- 월별로 몇일까지 있는지 담은 객체를 만든다. (Months)
- a와 비교해서 a월에 몇일까지 있는지를 확인한다.
- Months에서 a-1월까지 요일 수를 전부 더하고 b-1한 값도 더한다
- 위의 수를 7로 나눈 나머지를 구한다.
- 이 나머지 값을 Days의 인덱스로 두고 이를 리턴한다.
3. 실행
- 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
const Months = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
const Days = ['FRI', 'SAT', 'SUN', 'MON', 'TUE', 'WED', 'THU'];
const solution = (a, b) => {
const sumDays = Months.slice(0, a-1).reduce((acc, cur) => {
return acc + cur;
}, 0);
return Days[(sumDays + b - 1) % 7];
};
test('findDay', () => {
expect(solution(5, 24)).toEqual("TUE");
});
우선, 매월에 몇일까지 있는지에 대한 정보를 담은 배열을 만들었고
그다음에는 요일 이름을 담은 배열을 만들었다.
요일 이름을 담은 배열을 만들때에는
문제에서 주어진 2016년1월1일은 금요일이라는 전제를 참고해서
배열 내에서 순서도 금요일부터 시작할 수 있도록 했다.
그리고 a월 전의 달들 (a월이 5월이라면 1,2,3,4월들)의 요일수를 더하기 위해서 reduce를 사용했다.
이때 처음에는 slice를 Months[0,a]로 했었는데 이렇게 되면 a월을 포함해버리기 때문에 안된다는 것을 테스트 코드 돌리다가 알게되었다.
이렇게 지나간 달들의 요일수를 다 더한 값과 b-1일을 더해주었다.
그리고 일주일이 7일이라는 것을 생각해서 이 값을 7로 나눈 나머지를 구했고
이를 Days의 인덱스로 넣어서 리턴해줬다.
'코테연습' 카테고리의 다른 글
68. 같은 숫자는 싫어 Javascript (0) | 2022.06.23 |
---|---|
67. 나머지가 1이 되는 수 찾기 (0) | 2022.06.22 |
65. 두 개 뽑아서 더하기 (0) | 2022.06.20 |
63. 다트 게임 (0) | 2022.06.15 |
62. 비밀지도 Javascript (0) | 2022.06.14 |
댓글