[백준] 연도 진행바 (1340)(kotlin)

문제 설명

백준 1340번 문제 링크

입력 및 출력

» 입력

  • 첫째 줄에 Month DD, YYYY HH:MM과 같이 주어진다. Month는 현재 월이고, YYYY는 현재 연도이다. 숫자 네자리이다. DD, HH, MM은 모두 2자리 숫자이고, 현재 일, 시, 분이다. Month는 January, February, March, April, May, June, July, August, September, October, November, December 중의 하나이고, 연도는 1800보다 크거나 같고, 2600보다 작거나 같다. 항상 올바른 날짜와 시간만 입력으로 주어진다.

» 출력

첫째 줄에 문제의 정답을 출력한다. 절대/상대 오차는 10-9까지 허용한다.

예제 입출력(테스트케이스)

입력 출력
May 10, 1981 00:31 35.348363774733635

문제 힌트

평년일 때, 각 달은 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31일이 있다. 윤년에는 2월이 29일이다. 윤년은 그 해가 400으로 나누어 떨어지는 해 이거나, 4로 나누어 떨어지면서, 100으로 나누어 떨어지지 않는 해 일때이다. 지역에 따른 서머타임은 고려하지 않는다.

문제 풀이1

import java.io.BufferedReader
import java.io.InputStreamReader

fun main(args: Array<String>) = with(BufferedReader(InputStreamReader(System.`in`))) {
    val dateTime = readLine()
        .split(",")
        .map { it.trim() }
    val (month, day) = dateTime[0]
        .split(" ")
    val (year, time) = dateTime[1]
        .split(" ")

    val isLeapYear =
        if (year.toInt() % 4 == 0)  {
            if (year.toInt() % 400 == 0 && year.toInt() % 100 == 0) true
            else if (year.toInt() % 400 == 0 && year.toInt() % 100 != 0) true
            else !(year.toInt() % 400 != 0 && year.toInt() % 100 == 0)
        } else {
            false
        }

    if (isLeapYear) {
        println(
            "%.9f"
                .format(
                    untilToday(
                        intArrayOf(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),
                        monthToInt(month),
                        day.toInt() - 1,
                        time.split(":").map { it.toInt() }
                    ) * 100
                )
        )
    } else {
        println(
            "%.9f"
                .format(
                    untilToday(
                        intArrayOf(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),
                        monthToInt(month),
                        day.toInt() - 1,
                        time.split(":").map { it.toInt() }
                    ) * 100
                )
        )
    }


}

fun untilToday(year: IntArray, thisMonth: Int, today: Int, currentTime: List<Int>): Double {
    var seconds = 0
    val dayToSecond = 60 * 60 * 24

    for (i in 0 until thisMonth - 1) {
        seconds += (dayToSecond * year[i])
    }
    seconds += (dayToSecond * today)
    seconds += (currentTime[0] * 3600 + currentTime[1] * 60)

    return seconds.toDouble() / (year.sum().toDouble() * dayToSecond.toDouble())
}

fun monthToInt(month: String): Int {
    return when(month) {
        "January" -> 1
        "February" -> 2
        "March" -> 3
        "April" -> 4
        "May" -> 5
        "June" -> 6
        "July" -> 7
        "August" -> 8
        "September" -> 9
        "October" -> 10
        "November" -> 11
        else -> 12
    }
}