문제 링크
문제 해설
날짜 계산 문제다. 처음에는 단순히 날짜만 계산하면 될 것이라 생각하고 두 입력을 시간값으로 파싱하여 그 차이가 1000년 이상인 경우만 생각했다가 틀렸습니다가 나왔다. 원인을 분석해보니 단순히 날짜의 차이만 계산하다보니 중간의 수많은 윤년의 존재로 인해 y+1000년 m월 d일 이전의 날짜인데도 365,000일이 넘는 경우가 발생하여 gg를 출력한 것이다.
그리하여 원시적인 방법으로 일수를 계산하는 것으로 해결하는 쪽으로 방향을 틀었다. 입력받은 날짜로부터 윤년인지를 검사하면서 총 일수를 계산하고 차이 일수를 출력했다.
중요한 점은 y+1000년 m월 d일부터 gg를 출력해야 하므로 두 날짜의 연도 차이가 1000보다 큰 경우, 연도의 차이가 1000 이상이면서 월, 일만 계산했을 때 캠프 종료일자가 더 이후인 경우에 gg를 출력하도록 구현하였다.
Code
fun main() = with(System.`in`.bufferedReader()) {
val today = readLine().split(" ").map { it.toInt() }
val d_day = readLine().split(" ").map { it.toInt() }
println(
if (d_day[0] - today[0] > 1000 || (d_day[0] - today[0] >= 1000 && (getDay(0, d_day[1], d_day[2]) >= getDay(0, today[1], today[2]))))
"gg"
else
"D-${getDay(d_day[0], d_day[1], d_day[2]) - getDay(today[0], today[1], today[2])}")
}
// 윤년인지 검사
fun isLeap(year: Int) = if (year % 400 == 0) true else if (year % 100 == 0) false else year % 4 == 0
// 연월일을 파라미터로 받아 총 일수를 계산
fun getDay(y: Int, m: Int, d: Int): Int {
var result = 0
for (i in 1 until y) {
result += if (isLeap(i)) 366 else 365
}
for (i in 1 until m) {
result += if (i == 2 && isLeap(y)) 29 else month[i - 1]
}
return result + d
}
// 월별 일수를 저장하는 배열
val month = arrayOf(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
'Algorithm > BOJ' 카테고리의 다른 글
[Kotlin] 백준 1010 : 다리 놓기 (1) | 2022.11.24 |
---|---|
[Kotlin] 백준 1094 : 막대기 (0) | 2022.11.23 |
[Kotlin] 백준 1251 : 단어 나누기 (0) | 2022.11.23 |
[Kotlin] 백준 1181 : 단어 정렬 (0) | 2022.11.22 |
[Kotlin] 백준 1811 : Adjacent Mastermind (0) | 2022.11.22 |
댓글