본문 바로가기
알고리즘 문제

[알고리즘 문제] 프로그래머스 - 2016

by 박연호의 개발 블로그 2019. 12. 4.

https://programmers.co.kr/learn/challenges

 

프로그래밍 강의 | 프로그래머스

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

문제 설명입니다.

 

" 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를 반환하세요 "

 

단순히 월/일이 주어졌을 때 그 날의 요일을 반환하는 문제입니다.

 

 

 

 

문제 해결 방법은 간단합니다.

 

 

0 -> 목

1 -> 금

2 -> 토

3 -> 일

4 -> 월

5 - > 화

6 -> 수

다음과 같은 index와 값을 가지는 weeks[7]배열을 가집니다. 이 배열은 나중에 몇일에 해당하는 요일을 구하기위해 사용합니다. 

예를 들어, weeks[5], 1월 5일은 화요일입니다. 그러면 25일의 경우 배열의 크기에서 벗어나게 됩니다. 그렇기 때문에 weeks[일 % 7]을 해줍니다. 나머지 연산자를 사용하여 배열의 크기를 벗어났을 때, 다시 배열 처음부터 시작(?)할 수 있게 해줍니다.

 

그리고 각각의 달이 몇일까지 존재하는지를 저장하는 배열을 만들어 줍니다(1월은 제외)

왜냐하면 2월 17일의 경우, 1월 1일부터 몇일이나 지났는지 검사하기 위함입니다.

 

 int months[12] = {0,31,29,31,30,31,30,31,31,30,31,30}; 

0월은 없기 때문에 month[0]=0이고 , month[1]은 1월이 31까지 있다는 의미 입니다.13월은 존재하지 않기 때문에 month[12]는 없습니다.

index와 월을 맞추기 위해 이런 식으로 하였습니다.

 

그럼 다음, 현재 달-1까지 반복하면서 지나온 일을 계산합니다.

그렇게 되면 위의 달력에서 2,3,4,5...달력을 계속 아래로 추가한 그림을 그릴 수 있고, 각각의 일은 달을 지날 때 마다 다시 1로 초기화 되는게 아니라 계속 1씩 더해지는 모양이 되겠죠. 1월 31일 -> 32,33,34,35,36......

 

그런 다음 현재 일수가 구해지면, weeks[ 일수 % 7 ]으로 값을 구할 수 있습니다.