[프로그래머스] 2016년

YoungHyun Kim·2023년 11월 22일
1

매일매일 알고리즘

목록 보기
4/30

문제

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 배열의 값을 꺼내오면 문제를 해결할 수 있다.

그런데 이런 방식으로 풀면, 다른 년도에는 활용할 수 있는 방법이 없으니, 조금 더 고민해보고 글을 수정할 때 다른 풀이를 같이 적어두려한다.

⭐️ 17:00 수정 )

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을 더한 다음에 해당 요일을 찾으면 쉽게 해결할 수 있는 문제였다.

게속해서 생각이 드는건데, 이런 알고리즘 문제를 풀어낼 때는 뭔가 조건을 해체하고 재조립(??)할 수 있는 창의력이 중요한 것 같다.

지금 무슨 얘기를 하는건가... 글을 쓰면서도 아리까리한데, 문제의 제한조건을 창의적으로 분석하는 능력이 중요하다고 생각이 든다.

지금만 봐도 나는 한참을 생각해서야 누적 일 수를 더한 다음에 요일을 더한다는 생각을 했으니 말이다.

다음 문제부터는 조건에 대해서 깊게, 다양한 방향에서 바라보도록 하는 시간을 가져보고 문제를 풀어봐야겠다!

profile
iOS 개발자가 되고 싶어요

0개의 댓글