본문 바로가기
🐣 알고리즘

[프로그래머스] Swift - 2016년 (LV.1)

by @Eddy 2023. 6. 14.
728x90

👆문제풀러 가기👆

문제 설명

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일같은 날짜는 주어지지 않습니다)

입출력 예

a b result
5 24 ["TUE"]

풀이 [ 메모리: 16.5mb, 최대시간: 0.03ms ] 

enum WeekDays: Int {
    case thu, fri, sat, sun, mon, tue, wed
}

func solution1(_ a:Int, _ b:Int) -> String {
    var days = 0

    for m in 1..<a {
        switch m {
        case 1...7 where m == 2: days += 29
        case 1...7 where m % 2 == 1: days += 31
        case 1...7 where m % 2 == 0: days += 30
        case 8...12 where m % 2 == 1: days += 30
        case 8...12 where m % 2 == 0: days += 31
        default: break
        }
    }

    guard let result = WeekDays(rawValue: (days + b) % 7) else { return "" }

    switch result {
    case .thu: return "THU"
    case .fri: return "FRI"
    case .sat: return "SAT"
    case .sun: return "SUN"
    case .mon: return "MON"
    case .tue: return "TUE"
    case .wed: return "WED"
    }
}

enum을 활용해 연습하기 좋은 문제.

 

고려사항

1. 2월(윤달)일 때

2. 7월, 8월 기점으로 월말의 최대날짜가 바뀐다는 것

 

다른 풀이 [ 메모리: 16.5mb, 최대시간: 0.03ms ] 

func solution(_ a:Int, _ b:Int) -> String {
    let weekDays = ["THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"]
    let monthDays = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    let weekIndex = (monthDays[1..<a].reduce(0, +) + b) % 7

    return weekDays[weekIndex]
}

이런식으로도 풀 수 있구나 싶었던 풀이이다.

직관적이고 짧은 풀이이지만, 하드코딩이라는 점이 단점.

반응형

댓글