본문 바로가기
알고리즘 문제 풀이/백준

백준 1283 단축키 지정 Kotlin (문자열)

by 옹구스투스 2021. 11. 27.
반응형

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

 

1283번: 단축키 지정

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

www.acmicpc.net

문제

한글 프로그램의 메뉴에는 총 N개의 옵션이 있다. 각 옵션들은 한 개 또는 여러 개의 단어로 옵션의 기능을 설명하여 놓았다. 그리고 우리는 위에서부터 차례대로 각 옵션에 단축키를 의미하는 대표 알파벳을 지정하기로 하였다. 단축키를 지정하는 법은 아래의 순서를 따른다.

  1. 먼저 하나의 옵션에 대해 왼쪽에서부터 오른쪽 순서로 단어의 첫 글자가 이미 단축키로 지정되었는지 살펴본다. 만약 단축키로 아직 지정이 안 되어있다면 그 알파벳을 단축키로 지정한다.
  2. 만약 모든 단어의 첫 글자가 이미 지정이 되어있다면 왼쪽에서부터 차례대로 알파벳을 보면서 단축키로 지정 안 된 것이 있다면 단축키로 지정한다.
  3. 어떠한 것도 단축키로 지정할 수 없다면 그냥 놔두며 대소문자를 구분치 않는다.
  4. 위의 규칙을 첫 번째 옵션부터 N번째 옵션까지 차례대로 적용한다.

입력

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

출력

N개의 줄에 각 옵션을 출력하는데 단축키로 지정된 알파벳은 좌우에 [] 괄호를 씌워서 표현한다.

알고리즘 분류

풀이

간단한 문자열 문제이다.

문제의 핵심은,

1번 조건, 2번 조건을 확인하고, 1번, 2번 조건이 모두 충족되지 않는다면 그냥 그대로 출력한다.

 

우선 주어진 문장을 단어들의 배열로 저장하여 1번 조건인 각 단어의 첫 글자를 확인한다.

이때 단축키로 사용한 첫 글자는 set에 대소문자를 저장하여 set에 어떠한 단어의 첫 글자가 없다면 아직 단축키 지정이 되지 않은 것이다.

 

2번 조건은 앞에 1번 조건을 확인하는 과정에서, 모든 단어가 단축키 지정이 되어있다면, 해당 문장의 왼쪽부터 한 글자씩 차례대로 검사한다.

 

이외에 딱히 설명할 것은 없고 코드를 보는 것이 빠르다.

set에 단축키의 대소문자를 저장했지만, 저장은 대소문자 중 하나만 하고 검색을 대소문자로 하는 것이 더 낫다.

 

코드

import java.util.*
//1<=n<=30
//한 줄당 5개 단어 이하
//한 단어당 10개 글자 이하
fun main() = with(System.out.bufferedWriter()){
    val br = System.`in`.bufferedReader()
    val n = br.readLine().toInt()
    val alphaSet = mutableSetOf<Char>()

    for(i in 0 until n){
        val sen = br.readLine().split(' ')
        var idx=0
        var wordPass=true
        while(idx<sen.size){
            //해당 단어가 단축키 지정이 되지 않았다면
            if(alphaSet.indexOf(sen[idx][0])==-1){
                //단어의 첫 글자의 대소문자를 알파셋에 넣기
                alphaSet.add(sen[idx][0].toLowerCase()).also{ alphaSet.add(sen[idx][0].toUpperCase())}
                wordPass=false
                break
            }
            idx++
        }
        //모든 단어가 단축키 지정이 된 경우
        if(wordPass){
            var senPass = false
            for(i in 0 until sen.size){
                for(j in 0 until sen[i].length){
                    if (alphaSet.indexOf(sen[i][j]) == -1 && !senPass) {
                        //알파벳 감싸서 출력
                        write("[${sen[i][j]}]")
                        alphaSet.add(sen[i][j].toLowerCase()).also { alphaSet.add(sen[i][j].toUpperCase()) }
                        senPass = true
                    }else{
                        //해당 단어의 대소문자를 알파벳에 넣기, 알파벳 그대로 출력
                        write("${sen[i][j]}")
                    }
                }
                write(" ")
            }
        }
        //단축키 지정이 되지 않은 단어가 있는 경우
        else{
            for(i in 0 until sen.size){
                if(i==idx){
                    write("[${sen[i][0]}]${sen[i].substring(1)} ")
                }
                else{
                    write("${sen[i]} ")
                }
            }
        }
        write("\n")
    }

    close()
}
반응형

댓글