[Algorithm] 프로그래머스 : 2016년

1Consumption·2020년 2월 29일
0

Algorithm

목록 보기
3/8

프로그래머스 lv1 2016년

코드

import Foundation

func solution(_ a:Int, _ b:Int) -> String {
    let day = ["FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"]
    let month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    
    var sum = b - 1
    
    for monthDay in 0 ..< a - 1 {
        sum += month[monthDay]
    }
    
    return day[sum % 7]
}

풀이과정

a(달)와 b(일) 가 이 매개변수로 주어지고, 해당 날짜의 요일을 반환하는 문제이다.
5월 24일이 매개변수로 주어지면, 해당 요일은 화요일이기 때문에 아웃풋은 TUE 일 것이다.

핵심 로직: a를 일로 변환하고, b와 더해준 값을 7로 나눈 나머지가 요일이다.

먼저 요일을 저장하는 배열 day, 달의 일수를 저장하는 배열 month를 상수 선언해줬다. day배열을 선언해주면서 2016년 1월 1일은 금요일이라는 점을 고려해줬다. 따라서 day 배열이 "FRI" 부터 시작하게 된다.
총 일수를 저장하는 sum 변수를 구할 때는주어진 a월 까지 일수를 구하면 안되고 전 달 까지 구해야 한다라는 점을 고려해줬다. 5월 24일이라고 쳤을 때, 실질적인 일수는 4월까지를 일로 변환한 값과 24일을 더한 값이지, 5월까지를 일로 변환한 값과 24를 더하진 않기 때문이다.
마지막으로 주어진 일에서 1을 빼줬다. day 배열의 index가 0부터 시작하기 때문이다. (1월 0일은 없으니까)

개선 사항

    var sum = b - 1
    
    for monthDay in 0 ..< a - 1 {
        sum += month[monthDay]
    }

이 부분을 reduce를 사용하여 다음과 같은 과정으로 줄일 수 있다.

let sum = month[0 ..< a - 1].reduce(0) { (Result, Int) -> Int in
	return Result + Int
} + b - 1
let sum = month[0 ..< a - 1].reduce(0) { (Result, Int) in Result + Int} + b - 1
let sum = month[0 ..< a - 1].reduce(0) {$0 + $1} + b - 1
let sum = month[0 ..< a - 1].reduce(0, +) + b - 1

고차함수는 정말 어려운 것 같다. 생각하는 틀을 깨도록 노력하자

profile
개발자가되고싶어요

0개의 댓글