본문 바로가기
  • 개발하는 곰돌이
Algorithm/BOJ

[Kotlin] 백준 1308 : D-Day

by 개발하는 곰돌이 2022. 11. 23.

문제 링크

 

1308번: D-Day

첫째 줄에 오늘의 날짜가 주어지고, 두 번째 줄에 D-Day인 날의 날짜가 주어진다. 날짜는 연도, 월, 일순으로 주어지며, 공백으로 구분한다. 입력 범위는 1년 1월 1일부터 9999년 12월 31일 까지 이다.

www.acmicpc.net



문제 해설

날짜 계산 문제다. 처음에는 단순히 날짜만 계산하면 될 것이라 생각하고 두 입력을 시간값으로 파싱하여 그 차이가 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)

댓글