카테고리 없음

[BAEKJOON] 28278 스택 2

응애~ 개발자 2025. 7. 25. 04:42
728x90
반응형

문제 요약

문제풀이

 이번 문제 스택에 관련된 문제이다. 스택에 관련 내용은 아래 글에서 참고 하면된다.

https://jih3508.tistory.com/110

 

[알고리즘 이론] 스택(Stack)

이론 이본에 볼 자료구조는 스택이다. 스택은 LIFO 후입선출인 자료구조이다. 즉 먼저들어간게 나중에 들어 온다는 뜻이다. 스택에 자세한 내용은 아래의 사이트에서 확인해라. https://ko.wikipedia.or

jih3508.tistory.com

 

스택 관련된 내용만 알면 문제 내용처럼 시킨는 데로 구현 하면 문제가 없다. 자세한것은 코드보고 참고 하면된다.

Code

 각 입력문 마다 출력함수 사용하면 시간 초과 나는 언어가 있다. 그래서 출력을 담을 리스트같은 자료구조사용해서 한번에 출력 함수 호출하는 식으로 구현 하면 통과가 된다. 그 부분은 각 코드 보고 참고 하면된다.

Python

원래 파이썬에는 다른 언어와 다르게 switch ~ case구문이 없다. 그래서 if ~ elif로 처리를 해야 했지만 파이썬 3.10버전 부터 match ~ case 구문을 제공 해주고 있다.

import sys
input = sys.stdin.readline

N = int(input())

stack = [] # 스택 초기화
log = [] # 결과 출력

for _ in range(N):
    line = list(map(int, input().split()))
    match(line[0]):
        # 정수 X를 스택에 넣는다.
        case 1:
            stack.append(line[1])
        # 스택에 정수가 있다면 맨 위의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다.
        case 2:
            log.append(-1 if len(stack) == 0 else stack.pop() )
        # 스택에 들어있는 정수의 개수를 출력한다
        case 3:
            log.append(len(stack))
        # 스택이 비어있으면 1, 아니면 0을 출력한다.
        case 4:
            log.append(1 if len(stack) == 0 else 0)
        # 스택에 정수가 있다면 맨 위의 정수를 출력한다. 없다면 -1을 대신 출력한다.
        case 5:
            log.append(-1 if len(stack) == 0 else stack[-1])


print("\n".join(map(str, log)))

Java

 자바는 기본으로 Stack으로 자료 구조를 제공한다. Stack 자료 구조 활용해서 구현 하면된다. 그리고 출력 할때 다른 언어와 다르게 리스트에서 담아서 나중에 join함수사용 해서 처리 하지만 자바는 StringBuilder를 사용하면 문자열 추가처리 할때 성능이 좋다. 그래서 자바에서 문자열을 추가 할때 StringBuilder 사용 하면 좋다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;


public class Main {


	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader((System.in)));

		int N = Integer.parseInt(br.readLine());

		Stack<Integer> stack = new Stack<>(); // 스택 초기화

		StringBuilder log = new StringBuilder(); // 결과 출력
		for (int i = 0; i < N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			switch (st.nextToken()){
				// 정수 X를 스택에 넣는다.
				case "1":
					stack.push(Integer.parseInt(st.nextToken()));
					break;
				// 스택에 정수가 있다면 맨 위의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다.
				case "2":
					log.append(stack.isEmpty()? -1 : stack.pop()).append("\n");
					break;
				// 스택에 들어있는 정수의 개수를 출력한다
				case "3":
					log.append(stack.size()).append("\n");
					break;
				// 스택이 비어있으면 1, 아니면 0을 출력한다.
				case "4":
					log.append(stack.isEmpty()? 1 : 0).append("\n");
					break;
				// 스택에 정수가 있다면 맨 위의 정수를 출력한다. 없다면 -1을 대신 출력한다.
				case "5":
					log.append(stack.isEmpty()? -1 : stack.peek()).append("\n");
					break;
			}
		}

		System.out.println(log.toString());

	}

}

Javascript

var input = require('fs').readFileSync("/dev/stdin", "utf-8").trim().split("\n");

const N = parseInt(input[0]);

let stack = []; // 스택 초기화

let log = [] // 결과 출력

for (let i = 1; i <= N; i++) {
    const line = input[i].replace("\r","").split(' ');
    switch (line[0]) {
        // 정수 X를 스택에 넣는다.
        case '1':
            stack.push(parseInt(line[1]));
            break;
        // 스택에 정수가 있다면 맨 위의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다.
        case '2':
            log.push(stack.length === 0? -1 : stack.pop());
            break;
        // 스택에 들어있는 정수의 개수를 출력한다
        case '3':
            log.push(stack.length);
            break;
        // 스택이 비어있으면 1, 아니면 0을 출력한다.
        case '4':
            log.push(stack.length === 0? 1: 0);
            break;
        // 스택에 정수가 있다면 맨 위의 정수를 출력한다. 없다면 -1을 대신 출력한다.
        case '5':
            log.push(stack.length === 0? -1: stack[stack.length - 1]);
            break;

    }
}

console.log(log.join('\n'));
728x90
반응형