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

[Kotlin] 백준 1251 : 단어 나누기

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

문제 링크

 

1251번: 단어 나누기

알파벳 소문자로 이루어진 단어를 가지고 아래와 같은 과정을 해 보려고 한다. 먼저 단어에서 임의의 두 부분을 골라서 단어를 쪼갠다. 즉, 주어진 단어를 세 개의 더 작은 단어로 나누는 것이다

www.acmicpc.net



문제 해설

완전 탐색법으로 풀어야 하는 문제다. 주어진 단어를 3개로 나눈 후 각각을 뒤집어서 합쳐서 나온 단어들 중 사전순으로 가장 앞서는 단어를 구하기 위해서 2중 반복문을 돌려서 각 경우의 단어를 만든다. 이후, 새롭게 만들어진 단어와 이전 케이스에서 나온 단어를 비교하여 사전순으로 앞서는 단어를 비교하여 앞서는 단어를 결과에 저장하는 과정을 반복하여 해답을 구한다.

 

Kotlin에서는 slice() 메소드를 통해 문자열을 쉽게 나눌 수 있으며 reversed() 메소드를 통해 문자열을 쉽게 뒤집을 수 있다. 각 부분의 길이는 1 이상이어야 하므로 첫번째 부분을 얻기 위한 루프는 (원본 단어의 마지막 인덱스 - 2)까지 반복해야 하며, 두번째 부분을 얻기 위한 루프는 (첫번째 부분 + 1)부터 (원본 단어의 마지막 인덱스 - 1)까지 반복한다. 마지막 세번째 부분은 (두번째 부분 + 1)부터 남은 부분이 된다.

 

각 부분이 구해졌다면 이를 reversed() 메소드로 뒤집어서 더해 만들어진 새로운 단어와 이전 케이스에서 만들어진 단어를 minOf() 메소드를 통해 사전순으로 앞서는 단어를 저장하는 과정을 반복한다.

Kotlin의 maxOf(), minOf()

Kotlin에서는 Java의 Math 클래스에서 제공하는 max(), min() 메소드를 maxOf(), minOf()로 제공한다. Java의 경우와 다른 점은 Comparable 인터페이스를 구현하여 비교가 가능하게 만든 클래스들 또한 maxOf(), minOf()로 비교가 가능하다는 점이다. Kotlin의 String 클래스 또한 Comparable 인터페이스를 구현하고 있기 때문에 문자열의 순서를 손쉽게 비교할 수 있다.

Code

fun main() = with(System.`in`.bufferedReader()) {
    val word = readLine()
    val last = word.lastIndex
    var result = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"	// 사전순으로 가장 뒤에 오는 임시값

    for (i in 0..last - 2) {
        for (j in i + 1..last - 1) {
            val new = word.slice(0..i).reversed() + word.slice(i + 1..j).reversed() + word.slice(j + 1..last).reversed()
            result = minOf(result, new)
        }
    }
    println(result)
}

'Algorithm > BOJ' 카테고리의 다른 글

[Kotlin] 백준 1010 : 다리 놓기  (1) 2022.11.24
[Kotlin] 백준 1094 : 막대기  (0) 2022.11.23
[Kotlin] 백준 1308 : D-Day  (0) 2022.11.23
[Kotlin] 백준 1181 : 단어 정렬  (0) 2022.11.22
[Kotlin] 백준 1811 : Adjacent Mastermind  (0) 2022.11.22

댓글