개발조각

[프로그래머스] 2016년 본문

알고리즘🅰/프로그래머스

[프로그래머스] 2016년

개발조각 2022. 2. 11. 19:33
728x90
반응형

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

금-> 토-> 일-> 월-> 화요일

 

  1. 2016년 1월 1일은 금요일입니다.
  2. 2016년은 윤년
  3. 1월부터 12월까지 한 달에 며칠 있는지
  4. (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. 1월 ~ 12월 일 수를 배열에 넣기, 금요일 ~ 목요일 배열에 넣기
  2. a-1월까지의 일 수 구하기
  3. 최종 일 수 구한 뒤 요일 구하기

 

 

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()를 쓴 분들도 있는데 뭔가 편법? 같아서 안 썼습니다.

728x90
반응형
Comments