본문 바로가기

항해99_10기/[2주차] 알고리즘 문제풀이

[1번][연습문제][Lv.1] 2016년

문제

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

나의 답

이거 정말 짜증났던게, 아래 days 배열의 시작 요일을 금요일로 하고, return 할때, days 배열의 인덱스값에 -1을 해줬는데, 프로그래머스에서 채점을 하면 테스트 케이스 중 2개가 계속 틀린 것으로 나왔다.

그래서 질문하기를 통해 보니, 나와 같은 케이스의 분이 시작 요일을 변경해서 채점하면 통과한다고 글을 올려두어서 그대로 했더니 +10으로 통과가 되었다...

 

맞는 답을 틀리다고 해서 나의 소중한 시간을 많이 뺏겼다..ㅠㅠ

 

로직은 간단하다.

일자를 7로 나눴을 때 나머지 값으로 요일을 메겨주면 된다.

2016년 1월 1은 금요일이므로, [금, 토, 일, 월, 화, 수, 목] 의 순서로 요일 배열을 만들어 준다.

그리고 월마다 끝나는 일자가 다르므로, 이것도 배열을 만들어, 입력받은 달의 앞전 달까지의 총 일자를 더해준다.

1월 1일 : 1+0 %7 == 1 -> 금요일

2월 29일 : (29+ 31) % 7 == 4 -> 월요일

function findDays(a, b) {
  const days = ["THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"];
  const month = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  let addDays = 0;

  for (i = 0; i < a; i++) {
    addDays += month[i];
  }
  return days[(b + addDays) % 7];
}

솔직히, 다른 사람의 답을 보면 정말 많은 사람들이 메서드와 객체를 사용해서 문제를 푸는데, 그게 알고리즘 문제를 푸는 것이 맞는지 의문이 들긴 한다. 하지만, 현업에서 개발하기 위해서는 내장 객체를 잘 사용해야겠지... 그렇게 문제를 해결해 나가는 연습을 하는게 훨씬 더 실용적이겠지 하는 생각이 들기도 한다.

 

만약 위의 코드에 연도까지 입력을 받고 싶다면,

서기 1년 1월 1일이 월요일이고, 윤년(4년에 한번씩 1일이 더 생김)을 계산해서 1.1.1부터 입력받는 날짜까지의 총 일수를 받아 7로 나눈 나머지 값을 넣어주면 되겠다.