코딩/프로그래머스 코딩테스트

[프로그래머스] 2016년

민쯔 2021. 11. 5. 17:31
728x90
반응형

안녕하세요. 민쯔입니다.😊
프로그래머스 문제를 일주일에 하나씩 풀다 보니까 진도가 못 나가는 기분이 들어서 이제는 틈만 나면 풀려고요!!😤

이번에는 2016년 문제를 풀었는데요. 이번 문제는 단순하게 생각하면 정말 쉬운 문제인 것 같아서
그래서 저도 빠르게 푼 것 같아요.

그럼 해결방안에 대해 설명하겠습니다~

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];
}

문제 설명

  • 2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요?

제한 조건

  • 2016년은 윤년입니다.
  • 2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일 같은 날짜는 주어지지 않습니다)

 

이 해결방안을 이해하려면 윤년이 뭔지부터 알아야 됩니다.

윤년을 검색해 보니
보통 2월은 28일까지 있는데 윤년은 4년마다 한번씩 2월이 28일이 아닌 29일까지 있는 날입니다.

그래서 2016년에 1월부터 12월까지 한 달에 며칠이 있나면

  • 1월 31일
  • 2월 29일
  • 3월 31일
  • 4월 30일
  • 5월 31일
  • 6월 30일
  • 7월 31일
  • 8월 31일
  • 9월 30일
  • 10월 31일
  • 11월 30일
  • 12월 31일

있습니다.

 

그리고 이 문제는 요일을 구해야 되는 게 문제잖아요?

1월 1일이 금요일이고 +7일마다 같은 요일로 돌아옵니다.

  • 1월 1일 금요일
  • 1월 8일 금요일
  • 1월 15일 금요일
  • 1월 22일 금요일
  • 1월 29일 금요일

이거보다 보면 규칙이 보이지 않나요?

(7* n) + 1 = 금요일이라는 식이 이게 정말 중요한데 이건 밑에 테스트 1에서 보충해서 설명하겠습니다.

 

이제 앞에서 말한 정보 "2016년 1월 1일은 금요일입니다.", "2016년은 윤년", "1월부터 12월까지 한 달에 며칠 있는지", "(7* n) + 1 = 금요일"이 정보를 활용해서 2016년 a월 b일 무슨 요일인지를 테스트 1의 예제로 설명하자면

테스트 1

5월 24일의 일 수를 계산하면

1월 + 2월 + 3월 + 4월 + 24일 = 31일 + 29일 + 31일 + 30일 + 24일 = 145일

145일이 됩니다.

 

앞서 말한 "(7* n) + 1 = 금요일"에서 +1이 있으므로 총일수에 -1을 해줘야 됩니다.
그리고 7로 나눈 나머지 값에 따라 금요일부터 토, 일 이런 식으로 계산을 해주면 됩니다.

(145 -1) % 7 = 4

금요일 다음부터 +4일 -> 토 일 월 화

이렇게 최종적으로 화요일 됩니다.

 

이걸 코드로 작성하면

1월 ~ 12월 일 수를 배열에 넣기, 금요일 ~ 목요일 배열에 넣기

// 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'];

요일은 1월 1일이 금요일이라서 그 순서대로 넣었습니다.

 

a-1월까지의 일 수 구하기

// a-1월 까지의 일 수 구하기
for(let i=0; i<a-1; i++){
	sum += mDArr[i];
}

여기까지가 a가 5라고 하면
1월 ~ 4월까지의 일 수 계산입니다.

 

최종 일 수 구한 뒤 요일 구하기

sum = (sum + b - 1) % 7;    
return dW[sum];

sum + b = 최종 일 수

-1 : 기존 1월 1일의 1일 빼기

 

728x90
반응형