문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/12901
난이도 : Level.1
언어 : Kotlin
문제 설명 :
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 |
풀이 :
import kotlin.math.abs
class Solution {
fun solution(a: Int, b: Int): String {
val month = intArrayOf(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
val day = arrayOf("FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU")
return try {
day[((month.sliceArray(0 until a - 1).sum() + b) % 7) - 1]
} catch(_: Exception) {
val reversedDay = day.reversed()
reversedDay[abs(((month.sliceArray(0 until a - 1).sum() + b) % 7))]
}
}
}
나의 풀이대로라면 7로 나머지 연산을 하기 때문에 day arr 기준으로 원했던 날의 다음 요일이 도출된다.
이를 방지하기 위해 -1을 해주었는데, 0으로 나누어 떨어지는 테스트 케이스가 존재하기 때문에 그 때 -1이 된다면 에러가 발생하게 된다.
try를 통해 에러가 발생했을 때를 잡아내어 "THU"를 넣어주면 해결된다.
하지만 문제를 풀 당시에는 -1이 아니라 -2 이상이 나올 수도 있다고 생각했기 때문에 day를 뒤집고 계산된 index를 abs를 통해 음수를 제거 한 뒤 요일을 도출하는 방법을 사용했다.
단순하게 예를 들어,
1월 1일은 금요일 이므로 다음주 금요일은 1월 8일이다.
즉, 오늘이 1월 1일이면 7일 뒤가 1월 8일이 되는 것인데, 나는 단순히 계산을 했기에 1월 8일까지를 계산하면 8일이 필요하게 된다. (1월 1일도 포함하고 계산하기 때문.) 그래서 -1을 해주는 것.
그렇다면 다음주 목요일은 1월 7일인데, 1월 1일까지 포함해서 계산하게 되면 7이 나오므로 나머지 연산을 통해 0이 나오게 된다. 이 때 -1을 하게 되면 위에서 말한대로 에러가 발생하게 되는 것이다. 그래서 목요일을 구할때는 항상 -1이 나와 오류가 잡히게 되는 것일 건데, 이렇게 생각하면 단순히 catch에 "THU"만 넣어도 해결은 될 것이다. 7로 나머지 연산을 할 때 0이하의 값은 나오지 않을테니 거기에 -1만 더해진다고 하면 -2 이하는 나오지 않는다는 생각이다.
최종적으로 코드는 이렇게 줄일 수 있을 것이다.
class Solution {
fun solution(a: Int, b: Int): String {
val month = intArrayOf(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
val day = arrayOf("FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU")
return try { day[((month.sliceArray(0 until a - 1).sum() + b) % 7) - 1] } catch(_: Exception) { "THU" }
}
}
'프로그래머스 > Level 1' 카테고리의 다른 글
[Lv. 1] 과일 장수 (0) | 2023.06.30 |
---|---|
[Lv. 1] 명예의 전당 (1) (0) | 2023.06.30 |
[Lv. 1] 콜라 문제 (0) | 2023.06.29 |
[Lv. 1] 가장 가까운 같은 글자 (0) | 2023.06.29 |
[Lv. 1] 푸드 파이트 대회 (0) | 2023.06.29 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!