백준/문제

29198번: 이번에는 C번이 문자열

스몰스테핑 2024. 9. 6. 16:22

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

 

언어 : Kotlin

 

문제 설명 :

지난 대회에 이어 이번에도 문자열 문제를 출제하고 싶은 에릭은 다음과 같은 문제를 떠올렸다. 정답 코드를 짜기 귀찮은 에릭을 위해 대신 문제를 풀어주자!

 

  • 길이가 M인 N개의 문자열 S_1, S_2, ..., S_N이 주어진다.
  • 다음 방법으로 만들 수 있는 문자열 T 중 사전순으로 가장 앞에 오는 것을 출력한다. 
    1. S_1, S_2, ..., S_N 중 K개를 선택한 후, 이어 붙여서 길이 K ... M의 문자열을 만든다.
    2. 이렇게 얻은 K ... M개의 문자를 적당히 재배치하여 문자열 T를 만든다.

서로 다른 두 문자열 a, b에 대해 다음 중 하나가 성립할 때 문자열 a가 문자열 b보다 사전순으로 앞에 온다고 말한다.

  • a가 b의 접두사
  •  a와 b가 달라지는 첫 위치에서 a의 문자가 알파벳 순으로 b의 문자보다 앞에 위치함

 

입력 :

첫 번째 줄에 세 정수 N, M, K가 공백으로 구분되어 주어진다.
i + 1번째 줄에는 문자열 S_i가 주어진다. (1 ≤ i ≤ N)

 

출력 :

S_1, S_2, ..., S_N을 이용하여 위에서 설명한 방법으로 만들 수 있는 문자열 T 중 사전순으로 가장 앞에 오는 것을 출력한다.

 

제한 사항 :

  • 시간 제한 : 1초
  • 메모리 제한 : 1024MB
  •  1 ≤ K ≤ N ≤ 300
  •  1 ≤ M ≤ 300
  • 는 영어 대문자로 구성된 길이 M의 문자열 (1 ≤ i ≤ N)

 

입출력 예 :

입력 출력
4 1 2
Y
Y
Z
X
XY
3 4 2
ABCD
AACC
ABCC
AAABCCCC

 

풀이 : 

import java.io.BufferedWriter
import java.io.OutputStreamWriter

fun main() = with(System.`in`.bufferedReader()) {
    val bw = BufferedWriter(OutputStreamWriter(System.out))

    val (n, m, k) = readLine().split(" ").map { it.toInt() }
    val list = MutableList(n) { readLine().toCharArray().sorted().joinToString("") }.sorted()

    val sb = StringBuilder()
    for (i in 0 until k) {
        sb.append(list[i])
    }
    
    bw.write(sb.toString().toCharArray().sorted().joinToString(""))
    bw.flush()
    bw.close()
}