[백준] 크로스워드 만들기 (2804)(kotlin)

문제 설명

백준 2804번 문제 링크

입력 및 출력

» 입력

첫째 줄에 두 단어 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))
}