[백준] 크로스워드 만들기 (2804)(kotlin)
문제 설명
입력 및 출력
» 입력
첫째 줄에 두 단어 A와 B가 주어진다. 두 단어는 30글자 이내이고, 공백으로 구분되어져 있다. 또, 대문자로만 이루어져 있고, 적어도 한 글자는 두 단어에 포함되어 있다.
» 출력
A의 길이를 N, B의 길이를 M이라고 했을 때, 출력은 총 M줄이고, 각 줄에는 N개 문자가 있어야 한다. 문제 설명에 나온 것 같이 두 단어가 교차된 형태로 출력되어야 한다. 나머지 글자는 ‘.’로 출력한다.
예제 입출력(테스트케이스)
입력 | 출력 |
---|---|
BANANA PIDZAMA | .P…. .I…. .D…. .Z…. BANANA .M…. .A…. |
문제 풀이1
fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
val (A, B) = readLine().split(" ")
val setA = A.toSet()
val setB = B.toSet()
val interAB = setA.intersect(setB)
val list = mutableListOf<String>()
if (interAB.size > 1) {
val findFirst = mutableListOf<Pair<Char, Int>>()
for (char in interAB) {
findFirst.add(Pair(char, A.indexOf(char)))
}
val aFirst = findFirst.minByOrNull { it.second }
val bb = B.indexOf(aFirst!!.first)
for (i in B.indices) {
var str = ""
if (i != bb) {
for (j in A.indices) {
if (j != aFirst.second) str += "."
else str += B[i]
}
} else {
str = A
}
list.add(str)
}
} else {
val aa = A.indexOf(interAB.first())
val bb = B.indexOf(interAB.first())
for (i in B.indices) {
var str = ""
if (i != bb) {
for (j in A.indices) {
if (j != aa) str += "."
else str += B[i]
}
} else {
str = A
}
list.add(str)
}
}
list.forEach { println(it) }
}
문제 풀이2
fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
val (A, B) = readLine().split(" ")
val x = A.indexOfFirst { it in B }
val y = B.indexOf(A[x])
for (i in B.indices)
println(if (i == y) A else ".".repeat(x) + B[i] + ".".repeat(A.length - 1 - x))
}