알고리즘 - 프로그래머스 2016년 [요일 구하기] (swift)

2020. 7. 17. 15:21Algorism

반응형

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

입출력 예

abresult

5 24 TUE

 


이번 문제는 해당 날짜의 요일을 반환해주면 되는 문제네요. 

 

아래처럼 Foundation에 내장되어 있는 Date, Calendar, DateFormatter을 사용하면 쉽게 해결할 수 있습니다.

import Foundation


func solution(_ a:Int, _ b:Int) -> String {
    let weekArray = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"] // 요일 배열
    
    // date 포맷 선언
    let date = DateFormatter()
    date.locale = Locale(identifier: "ko_kr")
    date.dateFormat = "yyyy-MM-dd"
    
    let inputDay = date.date(from: "2016-\(a)-\(b)") // 입력받은 날짜 date 설정
    let cal = Calendar(identifier: .gregorian)	     // 그레고리 캘린더 선언
    let comps = cal.dateComponents([.weekday], from: inputDay!) // 입력 받은 날짜 캘린더 형시으로 변환
    
    return weekArray[comps.weekday! - 1] // 요일 반환
}

print(solution(5, 24)) // "TUE"

 

 

ㅎㅎ 위의 내용은 실제 개발에서 하는 내용이고... 문제에서 원하는 내용이 아니조.

위에 처럼 진행할 경우 속도가 300초 이상 발생합니다. 

 

그래서 단순 하게 더하기 나누기로만 요일을 구하는 방법을 요구하는것 같아요.

 

문제 해결 방법

1. 2016년 1월 1일이 무슨요일인지 확인한다.
2. 2016년의 모든 월의 종료 일자를 확인한다.
3. 입력받은 a월까지의 날짜를 모두 더하고 b의 날짜를 더해서 7(일주일)을 나눈다.
4. 그값을 요일 배열에서 꺼낸다.
func solution(_ a:Int, _ b:Int) -> String {
    let weekArray = ["THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"]
    let monthDayArray = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    var totalDay = b
    
    for index in stride(from: 0, to: a-1, by: 1) {
        totalDay += monthDayArray[index]
    }

    return weekArray[totalDay % 7]
}

print(solution(5, 24))

 

네 먼저 2016년의 요일을 확인해야 겠조.2016년 1월 1일은 금요일입니다.

아래 요일 배열을 선언했는데요. 

위에서 설명했듯이 모든 일자를 7로 나눠서 요일을 구할건데요.

달력에서는 1월 1일이 금요일로 시작되요

 

그래서 아래처럼 7을 나눠서 1이 되는값이 금요일로 시작했어요.

let weekArray = ["THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"]

 

 

그리고 모든 월의 날짜 배열을 선언해주고요.

let monthDayArray = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

 

모든날짜를 더할 변수에 입력받은 b의 날짜를 선언해줍니다.

var totalDay = b

 

그리고 이제 입력받은 a월 이전 달까지의 날짜를 모두 더해줍니다.

for index in stride(from: 0, to: a-1, by: 1) {
    totalDay += monthDayArray[index]
}

 

그리고 마지막으로 7을 나눈값을 요일배열에 입력하여 반환되는 요일을 리턴해주면 문제해결!

return weekArray[totalDay % 7]

 

 

# for문대신 "(monthDayArray[0..<a-1].reduce(0, +) + b) % 7" 이런식으로 구하면 편리한데... 제가 할때는 런타임 에러가 나더군요..;;

반응형