문제 출처 : https://www.acmicpc.net/problem/20114
언어 : Kotlin
문제 설명 :
미아는 과일을 좋아하는 소녀이다. 그녀의 비밀 노트에는 과일에 대해 그녀가 수집한 정보들이 가득하다.
평소와 다를 바 없이 과일들을 잔뜩 관찰하고 기쁜 마음으로 하교하던 어느 날, 친구가 뒤에서 덮치는 바람에 실수로 비밀 노트를 물에 빠뜨리고 말았다.
다행히 노트는 건질 수 있었지만, 노트에 적어두었던 정보들이 번지고 지워져버려 일부는 알아볼 수 없게 되었다.
노트에 적힌 문자열이 번진 패턴은 일정했는데, 가령 "abc" 문자가 세로로 3글자씩, 가로로 2글자씩 번진 경우는 다음과 같았다.
aabbcc
aabbcc
aabbcc
이 패턴을 이용해 문자열을 완전히 복원할 수 있을 것 같았지만, 아쉽게도 번진 문자열의 일부는 지워진 상태였다. 너무 많이 지워져버려서 해당 자리의 문자를 유추할 수 없는 경우, 완전히 문자열을 복원하지 못할 수도 있다.
미아는 자신이 아끼는 노트가 물에 빠진 바람에 매우 속상해하고 있다. 문자열을 최대한 완전히 복원해서 미아의 기를 살려주자!
입력 :
첫째 줄에 원래 문자열의 길이 N, 세로로 번진 글자의 개수 H, 가로로 번진 글자의 개수 W가 주어진다. (1 ≤ N ≤ 100, 1 ≤ H ≤ 10, 1 ≤ W ≤ 10)
둘째 줄부터 H개의 줄에 걸쳐 N × W 길이의 문자열이 주어진다. 문자열은 알파벳 소문자 또는 '?'로만 이루어져 있다. '?'는 해당 자리의 문자가 지워진 경우를 뜻한다.
문자가 번진 자리에 두 개 이상의 문자가 있는 등 모순되는 경우는 입력으로 주어지지 않는다.
출력 :
손상되기 전의 원래 문자열을 출력한다. 복원할 수 없는 문자는 '?'로 출력한다.
제한 사항 :
- 시간 제한 : 1초
- 메모리 제한 : 256MB
입출력 예 :
입력 | 출력 |
3 2 2 a????? ???bcc |
abc |
6 2 3 ???rrruuu???ttt??? f?f?rruuu?????t??? |
fru?t? |
풀이 :
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
val (n, h, w) = readLine().split(" ").map { it.toInt() }
val list = mutableListOf<String>()
val arr = Array(n) { "?" }
repeat(h) {
readLine().chunked(w).forEach {
list += it
}
}
val sb = StringBuilder()
list.chunked(n).also {
it.map {
it.map {
val temp = it.replace("?", "")
sb.append(if (temp.isEmpty()) "?" else temp[0])
}
sb.forEachIndexed { index, c ->
if (c != '?') {
arr[index] = c.toString()
}
}
sb.clear()
}
}
bw.write(arr.joinToString(""))
bw.flush()
bw.close()
}
'백준 > 문제' 카테고리의 다른 글
25325번: 학생 인기도 측정 (0) | 2024.07.04 |
---|---|
13022번: 늑대와 올바른 단어 (0) | 2024.07.04 |
28454번: Gift Expire Date (0) | 2024.07.03 |
31822번: 재수강 (0) | 2024.07.03 |
23304번: 아카라카 (0) | 2024.07.03 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!