본문 바로가기
코테연습

66. 2016년 Javascript

by hxunz 2022. 6. 21.

https://programmers.co.kr/learn/courses/30/lessons/12901

 

코딩테스트 연습 - 2016년

2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까

programmers.co.kr

 

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
     - 2016년 a월 b일이 무슨 요일인가?
  • 주어진 자료는 무엇인가?
     - 월 = a

     - 일 = b
  • 조건은 무엇인가?
     - 윤년 (2월29일까지 있음)
     - 13월 26일이나 2월 45일같은 날짜는 주어지지 않는다
     - 2016년 1월 1일은 금요일이다.

 

2. 계획

  • 이 문제를 푸는데 있어서 유용하게 쓸 수 있는 지식은 무엇인가?
     - reduce
  1. 요일 이름이 담긴 배열을 만든다. (Days)
  2. 월별로 몇일까지 있는지 담은 객체를 만든다. (Months)
  3. a와 비교해서 a월에 몇일까지 있는지를 확인한다.
  4. Months에서 a-1월까지 요일 수를 전부 더하고 b-1한 값도 더한다
  5. 위의 수를 7로 나눈 나머지를 구한다.
  6. 이 나머지 값을 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

댓글