본문 바로가기
알고리즘 문제 풀이/백준

백준 5671 호텔 방 번호 Kotlin (완전탐색)

by 옹구스투스 2022. 2. 17.
반응형

문제 출처 : https://www.acmicpc.net/problem/5671

 

5671번: 호텔 방 번호

선영이는 집 호수에 반복되는 숫자가 있는 경우에는 그 집에 사는 사람에게 불운이 찾아온다고 믿는다. 따라서, 선영이는 838호나 1004호와 같이 한 숫자가 두 번 이상 들어있는 집에는 절대 살지

www.acmicpc.net

문제

선영이는 집 호수에 반복되는 숫자가 있는 경우에는 그 집에 사는 사람에게 불운이 찾아온다고 믿는다. 따라서, 선영이는 838호나 1004호와 같이 한 숫자가 두 번 이상 들어있는 집에는 절대 살지 않을 것이다.

2050년, 선영이는 한국에서 가장 돈이 많은 사람이 되었다. 그녀는 해변가에 새로운 호텔을 하나 지으려고 한다. 하지만, 투숙객에게 불운이 찾아오는 것을 피하기 위해서 반복되는 숫자가 없게 방 번호를 만들려고 한다.

정부는 선영이의 호텔 방 번호는 N보다 크거나 같고, M보다 작거나 같아야 한다는 조건을 걸고 신축 허가를 내주었다. 선영이의 새 호텔에는 방이 최대 몇 개 있을 수 있을까? (두 방이 같은 방 번호를 사용할 수 없다)

입력

입력은 여러 개의 테스트 케이스로 이루어져 있고, 한 줄이다. 각 줄에는 문제의 설명에 나와있는 N과 M이 주어진다. (1 ≤ N ≤ M ≤ 5000)

출력

각각의 테스트 케이스에 대해서 N보다 크거나 같고, M보다 작거나 같은 수 중에서 반복되는 숫자가 없는 것의 개수를 출력한다.

알고리즘 분류

풀이

간단한 완전 탐색 문제이다.

n 이상 m 이하의 수 i에 대해서 i가 88, 121처럼 겹치는 수가 나온다면 호텔 방을 지을 수 없다

따라서 그냥 n부터 m까지의 i를 겹치는 수가 있는지 없는지 검사하여 겹치는 수가 없을 때만 결괏값에 더해주면 되는데,

여러 방법이 있지만 i를 String으로 바꾸고 String의 인덱스를 돌며 현재 자릿수의 값을 visited에 체크하고,

다음 자릿수의 값이 이미 visited에 체크된 값이면 수가 중복됐음을 확인하는 방식으로 풀었다.

 

코드

import java.util.StringTokenizer
val br = System.`in`.bufferedReader()

fun main() = with(System.out.bufferedWriter()){

    var input = br.readLine()
    while(input!=null){
        val tk = StringTokenizer(input)
        var n = tk.nextToken().toInt()
        val m = tk.nextToken().toInt()
        var answer=0
        //solve
        while(n<=m){
            val visited = BooleanArray(10)
            val str = n.toString()
            var canBuild=true
            for(i in str.indices){
                if(visited[str[i]-'0']){
                    canBuild=false
                    break
                }
                visited[str[i]-'0'] =true
            }
            if(canBuild) answer++
            n++
        }
        //output
        write("$answer\n")
        //next
        input = br.readLine()
    }
    close()
}
반응형

댓글