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

[Kotlin] 백준 9935 : 문자열 폭발

by 개발하는 곰돌이 2022. 12. 19.

문제 링크

 

9935번: 문자열 폭발

첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다. 둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다. 두 문자열은 모

www.acmicpc.net



문제 해설

스택을 사용하여 해결할 수 있다. 문제 해결 과정은 다음과 같다.

 

  1. 먼저 문자열을 앞에서부터 순회하면서 스택에 문자를 삽입한다.
  2. 스택에 문자를 삽입하는 도중에 폭발 문자열의 마지막 글자가 나타나면 폭발 문자열의 길이만큼 스택에서 문자를 제거하여 폭발 문자열인지 체크할 문자열을 만든다.
    • 이 때 스택에서 현재 스택의 크기가 폭발 문자열의 길이보다 작을 수 있기 때문에 EmptyStackException을 방지하기 위한 체크 로직을 작성해줘야한다.(이거 안해서 틀림)
  3. 스택에서 문자를 제거하여 만든 체크 문자열은 역순으로 이루어지기 때문에 문자열을 뒤집고 폭발 문자열과 비교한다.
  4. 체크 문자열과 폭발 문자열이 다른 경우엔 체크 문자열을 다시 스택에 삽입한다. 같은 경우엔 이미 스택에서 문자를 제거했으므로 추가 연산 없이 다음 문자로 넘어간다.

모든 과정을 거쳤을 때 스택이 비어있다면 FRULA를, 그 외에는 스택의 문자들을 joinToString()을 사용해 출력하면 된다.


Code

import java.util.Stack

fun main() = with(System.`in`.bufferedReader()) {
    val str = readLine()
    val bomb = readLine()
    val stack = Stack<Char>()
    for (c in str) {
        stack.push(c)
        if (c == bomb.last()) {
            var checkBombString = StringBuilder()
            for (i in bomb.indices) {
                if (stack.isEmpty()) break
                checkBombString.append(stack.pop())
            }
            checkBombString = checkBombString.reverse()
            if (checkBombString.toString() != bomb) {
                repeat(checkBombString.length) { stack.push(checkBombString[it]) }
            }
        }
    }
    println(if (stack.isEmpty()) "FRULA" else stack.joinToString(""))
}

댓글