오늘 푼 문제
https://school.programmers.co.kr/learn/courses/30/lessons/12901
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
내 코드
func solution(_ a:Int, _ b:Int) -> String {
let daysOfMonth = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] // 인덱스 0은 자리 표시자
let daysOfWeek = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]
// 1월 1일부터 주어진 날짜까지의 총 일수를 계산
let totalDays = (1..<a).reduce(0) { $0 + daysOfMonth[$1] } + (b - 1)
// 요일을 계산. 2016년 1월 1일은 금요일이므로, 5에서 시작.
let dayOfWeekIndex = (5 + totalDays) % 7
return daysOfWeek[dayOfWeekIndex]
}
daysOfMonth: 각 월에 해당하는 일 수를 담는 배열. 인덱스 0은 직접 사용하지 않고 자리 표시자로 사용됨
daysOfWeek: 일요일부터 토요일까지의 요일을 담은 배열
totalDays: 1월 1일 ~ a월 b일까지의 총 일수
dayOfWeekIndex: (시작요일(금요일) + 총 일 수) / 7 을 구하면 daysOfWeek 에서 해당 요일을 찾을 수 있다.
1월 부터 a - 1 까지의 월 별 일수를 더한 후, (시작일제외) b - 1 일을 추가로 더해주면, totalDays 를 구할 수 있다.
$0 은 현재까지의 누적 값이고, $1 은 범위 내의 현재 월(1,2...a-1) 까지의 값을 나타낸다.
느낀 점
해당 일의 요일을 알아내기 위해서, 시작 일 부터 해당 일까지의 totalDays 를 구하였다. 그 과정에서 reduce 메소드를 사용하여 누적값과 해당 요일의 일수를 더함으로써 계산하였다. 그 결과 반복문을 사용하여 길게 쓰는 것에서, 고차함수를 사용하여 간결하게 작성할 수 있었다.