반응형

백준 18312번 문제입니다. (solved.ac) 기준 브론즈 2 문제입니다.

https://www.acmicpc.net/problem/18312

 

18312번: 시각

정수 N과 K가 입력되었을 때 00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중에서 K가 하나라도 포함되는 모든 시각을 세는 프로그램을 작성하시오. 시각을 셀 때는 디지털 시계를 기준으로,

www.acmicpc.net

문제

문제 접근

어렵지 않은 완전탐색 문제입니다. 

첫 번째 줄에 n, k 를 입력 받고 00시 00분 00초 ~ n시 59분 59초까지중 k라는 숫자(문자)가 포함된 횟수를 출력하면 됩니다.

while문을 통하여 sec을 1씩 늘려주며 완전탐색하도록 구현하였습니다.

문자로 접근하여 풀면 02시 05분 07초와 같은 시간을 탐색하기 위하여 앞에 문자 0을 붙여주어야합니다.

이러한 번거로움을 피하고자 시, 분, 초 별 십의 자리(secFir 등) 일의 자리(secSec)을 분리하여 주었습니다. 십의 자리에는 현재 시,분,초 / 10이, 일의 자리에는 현재 시,분,초 % 10이 들어갑니다. 만약 현재 5초라면 십의자리(secFir)에는 0이 일의자리(secSec)에는 5가 들어가게됩니다.

정답 코드

fun main() {

    val (n, k) = readln().split(" ").map { it.toInt() }
    var sec = 0
    var min = 0
    var hour = 0

    // k가 나온 횟수
    var ans = 0

    // n이 12일 때 12시 59분 59초까지 탐색
    while (hour <= n) {

        // 12초 기준 1부분 (십의 자리)
        val secFir = sec / 10
        // 12초 기준 2부분 (일의 자리)
        val secSec = sec % 10

        // 34분 기준 3부분 (십의 자리)
        // 34분 기준 4부분 (일의 자리)
        val minFir = min / 10
        val minSec = min % 10

        // 23시간 기준 2부분 (십의 자리)
        val hourFir = hour / 10
        // 23시간 기준 3부분 (일의 자리)
        val hourSec = hour % 10

        // k가 현재 탐색중인 시간에 포함되어있다면 ans 1 증가
        if (secFir == k || secSec == k
            || minFir == k || minSec == k
            || hourFir == k || hourSec == k
        ) ans++

        // 완전탐색을 위하여 1초 증가
        sec++

        // 초 -> 분, 분 -> 시 로의 변환이 필요한가?
        var needToUp = false

        // 60초 -> 01분
        if (sec >= 60) {
            sec -= 60
            needToUp = true
        }

        if (needToUp) {
            min++
            needToUp = false
        }

        // 60분 -> 01시
        if (min >= 60) {
            min -= 60
            needToUp = true
        }

        if (needToUp) {
            hour++
        }

    }

    print(ans)
}

 

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기