본문 바로가기
알고리즘/구현(백준)

[2023-05-15] 1251 단어 나누기(Kotlin)

by joh9911 2023. 5. 15.

 

문제 링크: https://www.acmicpc.net/problem/1251

 

1251번: 단어 나누기

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

www.acmicpc.net

 

한 시간을 풀다가 결국 못 풀었습니다.

 

 

첫 번째 시도 (틀렸습니다.)

package fourtysixth
import java.io.*
fun main(){
    val br = BufferedReader(InputStreamReader(System.`in`))
    val input = br.readLine()

    val save = arrayListOf<Char>()

    val range1 = input.length - 3
    val range2 = input.length - 2
    val range3 = input.length - 1

    var start = 0

    var index1 = 0
    var value = input[start]
    for (i in start + 1 .. range1){
        if (value.code >= input[i].code){
            value = input[i]
            index1 = i
        }
    }

    if (value.code == input[start].code && value.code != 97){
        index1 = start
    }

    for (index in index1 downTo start){
        save.add(input[index])
    }
    start = index1 + 1

    var index2 = 0
    var value2 = input[start]
    for (i in start.. range2){
        if (value2.code >= input[i].code){
            value2 = input[i]
            index2 = i
        }
    }
    if (value2.code == input[start].code && value.code != 97){
        index2 = start
    }

    for (index in index2 downTo start){
        save.add(input[index])
    }

    start = index2 + 1

    for (index in range3 downTo start)
        save.add(input[index])

    save.forEach{print(it)}

}

 

계속 생기는 반례를 고치려고 코드를 추가하다 보니

코드가 이상해졌습니다.

 

접근이 잘못됐나 싶어 다른 분의 코드를 확인하였습니다.

 

 

 

두 번째 시도 (맞았습니다.)

package fourtysixth
import java.io.*
fun main(){
    val br = BufferedReader(InputStreamReader(System.`in`))
    val input = br.readLine()
    val save = arrayListOf<String>()

    for (i in 1 until input.length - 1){
        for (j in i + 1 until input.length){
            val a = input.substring(0 until i).reversed()
            val b = input.substring(i until j).reversed()
            val c = input.substring(j until input.length).reversed()
            var string = a + b + c
            save.add(string)
        }
    }
    save.sort()
    println(save.first())

}

 

 

방법은 모든 경우의 문자열들을 모두 저장한 후,

 

정렬하여 가장 첫 번째 원소를 출력하면 되는 것이었습니다.

 

어떻게 이런 생각을 하죠..

 

 

댓글