본문 바로가기
  • 개발하는 곰돌이
Algorithm/BOJ

[Kotlin] 백준 1283 : 단축키 지정

by 개발하는 곰돌이 2023. 1. 18.

문제 링크

 

1283번: 단축키 지정

첫째 줄에 옵션의 개수 N(1 ≤ N ≤ 30)이 주어진다. 둘째 줄부터 N+1번째 줄까지 각 줄에 옵션을 나타내는 문자열이 입력되는데 하나의 옵션은 5개 이하의 단어로 표현되며, 각 단어 역시 10개 이하

www.acmicpc.net



문제 해설

문제의 로직 자체는 여러울 것이 없다. 단축키를 저장할 Set을 선언한 후 단축키를 지정하는 방법을 순서대로 진행하며 지정되는 단축키를 Set에 삽입하고, 지정된 단축키에 대괄호를 씌워서 출력하는 것을 반복하기만 하면 된다. 다만, 단축키는 대소문자를 구분하지 않으므로 Set에 단축키를 삽입할 때 대문자 또는 소문자로 통일해야 한다.

 

세부적인 로직은 다음과 같다.

  1. 각 줄로 입력받은 옵션의 이름을 공백을 구분자로 분리하여 각 단어의 첫글자를 Set에 삽입해본다. 
    • 단축키로 지정되었다면 해당 단축키에 대괄호를 씌워서 출력한 후 다음 옵션으로 넘어간다.
  2. 1의 과정을 진행하여 단축키가 지정되지 않았다면 옵션의 각 단어를 처음부터 문자단위로 탐색하며 Set에 삽입해본다.
    • 단축키로 지정되었다면 해당 단축키에 대괄호를 씌워서 출력한 후 다음 옵션으로 넘어간다.
  3. 1과 2의 과정에서 단축키가 지정되지 않은 옵션은 그냥 그대로 출력한다.

로직 자체는 매우 간단하니 출력 형식을 맞춰서 출력하는 것만 신경써주면 된다.


Code

fun main() = with(System.`in`.bufferedReader()) {
    val bw = System.out.bufferedWriter()
    val n = readLine().toInt()
    val hotKeys = HashSet<Char>()
    loop@ for (i in 1..n) {
        val optionWords = readLine().split(' ').toMutableList()
        for (j in optionWords.indices) {
            if (hotKeys.add(optionWords[j][0].lowercaseChar())) {
                optionWords[j] = "[${optionWords[j][0]}]${optionWords[j].substring(1)}"
                bw.write("${optionWords.joinToString(" ")}\n")
                continue@loop
            }
        }

        for (j in optionWords.indices) {
            for (k in optionWords[j].indices) {
                if (hotKeys.add(optionWords[j][k].lowercaseChar())) {
                    optionWords[j] = "${optionWords[j].slice(0 until k)}[${optionWords[j][k]}]${optionWords[j].substring(k + 1)}"
                    bw.write("${optionWords.joinToString(" ")}\n")
                    continue@loop
                }
            }
        }

        bw.write("${optionWords.joinToString(" ")}\n")
    }
    bw.close()
}

댓글