스택 수열 - BOJ_1874(Stack, Queue, BufferdWriter-사용주의)


이번 문제는 Stack , Queue 개념을 활용해서 스택 수열을 구현하는 문제이다.

출처: https://www.acmicpc.net/problem/1874


배운 점

알고리즘은 맞는 것 같은데 계속 출력 초과가 발생하는 상황이었다.

다른 자바 언어 유저가 쓴 글을 보니 BufferdWriter 클래스를 사용시 버퍼가 일정 크기를 넘어서면 자동으로 flush해버리는 경우가 발생해 출력이 초과될 수 있다는 글이었다.

따라서 BufferdWriter 클래스의 버퍼 대신 StringBuilder 객체를 활용하는 방식으로 코드를 수정하니 정상 답안 처리가 되었다!!

비슷한 상황에서 같은 실수를 반복하지 않도록 조심하자

// 2022-01-26
// https://www.acmicpc.net/problem/1874

import java.io.*
import java.lang.StringBuilder
import java.util.*

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
  
    // BufferedWriter의 경우 일정 크기 이상 버퍼가 커지면 자동flush 문제가 발생(출력초과)
    // 따라서 기존 bw를 주석처리 해주고 StringBuilder 을 사용하자!!!!!!! 
    // val bw = BufferedWriter(OutputStreamWriter(System.`out`))
    val sb = StringBuilder()
    val queue:Queue<Int> = LinkedList()
    val queue2:Queue<Int> = LinkedList()
    val stack = Stack<Int>()

    repeat(readLine().toInt()){
        queue.add(readLine().toInt())
        queue2.add(it+1)
    }

    while(!queue2.isEmpty()) {
        if(stack.empty()) {
            stack.push(queue2.poll())
            sb.append("+\n")
            //bw.write("+\n")
        }
        else if(queue.peek() != stack.peek()) {
            stack.push(queue2.poll())
            sb.append("+\n")
            //bw.write("+\n")
        }else{
            queue.poll()
            stack.pop()
            sb.append("-\n")
            //bw.write("-\n")
        }
    }

    while(!stack.isEmpty()) {
        if(stack.pop() != queue.poll()){
            println("NO")
            return
        }
        else sb.append("-\n")
    }

    print(sb)
    // bw.flush()
    // bw.close()
}