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일같은 날짜는 주어지지 않습니다)
다른 언어로 했어도 이건 어떻게 풀어야되나 한참을 고민했을 것 같다. 다행히도(?) 여기서는 2016년만 따져보면 되니까 달력보고 노가다하기로 했다...
let date = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]
// 월 0 화 1 수 2 목 3 금 4 토 5 일 6
func solution(_ a:Int, _ b:Int) -> String {
var answer = ""
if a == 1 { answer = date[(b + 4) % 7] }
else if a == 2 { answer = date[b % 7] }
else if a == 3 { answer = date[(b + 1) % 7] }
else if a == 4 { answer = date[(b + 4) % 7] }
else if a == 5 { answer = date[(b + 6) % 7] }
else if a == 6 { answer = date[(b + 2) % 7] }
else if a == 7 { answer = date[(b + 4) % 7] }
else if a == 8 { answer = date[b % 7] }
else if a == 9 { answer = date[(b + 3) % 7] }
else if a == 10 { answer = date[(b + 5) % 7] }
else if a == 11 { answer = date[(b + 1) % 7] }
else if a == 12 { answer = date[(b + 3) % 7] }
return answer
}
코드 상단의 주석 내용대로, 각 월의 1일의 요일에 따라서 숫자가 정해져있고, 이것을 입력으로 받은 b 변수와 더한 다음, 7로 나눈 나머지값을 인덱스로 하여금 date
배열의 값을 꺼내오면 문제를 해결할 수 있다.
그런데 이런 방식으로 풀면, 다른 년도에는 활용할 수 있는 방법이 없으니, 조금 더 고민해보고 글을 수정할 때 다른 풀이를 같이 적어두려한다.
import Foundation
let date = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]
// 월 0 화 1 수 2 목 3 금 4 토 5 일 6
let endOfMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
func solution(_ a: Int, _ b: Int) -> String {
var past = 0
for i in 0..<a-1 {
past += endOfMonth[i]
print(past)
}
var answer = date[((past + b + 4) % 7)]
return answer
}
고민을 거듭하다가 풀어보는데 성공했다.
2016년은 윤년이라는 조건이 붙었기 때문에, 각 월이 몇 일을 가지고있는지를 배열로 정리했다.
a월 b일에 해당하는 입력을 받으면, a-1월 까지의 누적 일 수를 past
변수에 저장했다.
past
변수와 입력으로 받은 b 상수를 더하면 -> 1월 1일과 a월 b일 사이의 누적 일 수를 얻을 수 있음.
이 값을 7로 나눈 나머지를 date
배열의 인덱스로 활용하면 a월 b일이 무슨 요일인지 알 수 있다!
누적 일 수를 구해서 문제를 풀어내기 전에는, 입력받은 a월에 따라서 경우를 나누어서 계산해야하나 고민했는데...
그런 문제가 아니었다. 입력으로 7월 23일을 받았으면, 6월 까지의 일 수를 모두 더하고 거기에 23을 더한 다음에 해당 요일을 찾으면 쉽게 해결할 수 있는 문제였다.
게속해서 생각이 드는건데, 이런 알고리즘 문제를 풀어낼 때는 뭔가 조건을 해체하고 재조립(??)할 수 있는 창의력이 중요한 것 같다.
지금 무슨 얘기를 하는건가... 글을 쓰면서도 아리까리한데, 문제의 제한조건을 창의적으로 분석하는 능력이 중요하다고 생각이 든다.
지금만 봐도 나는 한참을 생각해서야 누적 일 수를 더한 다음에 요일을 더한다는 생각을 했으니 말이다.
다음 문제부터는 조건에 대해서 깊게, 다양한 방향에서 바라보도록 하는 시간을 가져보고 문제를 풀어봐야겠다!