[백준] 10828. 스택(Java8)

2022. 12. 28. 17:52·알고리즘/Java
반응형

문제

예제1

예제 1번은 아래와 같이 이해할 수 있습니다.

풀이1 - 런타임 에러 (ArrayIndexOutOfBounds)

런타임 에러 (ArrayIndexOutOfBounds)

- 배열에서 java.lang.ArrayIndexOutOfBoundsException은 배열의 크기를 벗어난 값에 접근하려고 할 때 발생합니다.

 

아래와 같이 코드를 작성하였을 때, 런타임 에러가 발생했습니다.

< 해당 에러가 발생한 원인은 "top"일 경우, 스택이 비어있을 경우 -1을 출력한다. > 에 대한 처리가 없어서 발생했습니다.

import java.io.*;
import java.util.*;

public class Main {

	public static void main(String[] args) throws Exception{
//		push X: 정수 X를 스택에 넣는 연산이다.
//		pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
//		size: 스택에 들어있는 정수의 개수를 출력한다.
//		empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
//		top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int n = Integer.parseInt(br.readLine());
		String s;
		int[] arr = new int[n];
		int cnt = 0;
		for(int i = 0; i < n; i++) {
			s = br.readLine();
			if(s.contains("push")) {
				StringTokenizer st = new StringTokenizer(s);
				st.nextToken();
				arr[cnt++] = Integer.parseInt(st.nextToken());
			}else {
				switch(s) {
					case "pop":
						if(arr[0] == 0) {
							sb.append(-1 + "\n");
						}else {
							sb.append(arr[cnt - 1] + "\n");
							arr[cnt-- - 1] = 0;
						}
						break;
					case "size":
						sb.append(cnt + "\n");
						break;
					case "empty":
						if(arr[0] == 0) {
							sb.append(1 + "\n");
						}else {
							sb.append(0 + "\n");
						}
						break;
					case "top":
						sb.append(arr[cnt - 1] + "\n");
						break;
				}
			}
		}
		
		System.out.print(sb);
		br.close();
	}

}

풀이2 - 정답 (배열 사용)

위의 런타임 에러를 해결하기 위해 "top"일 경우, 스택이 비어있을 경우 예외처리를 추가하였습니다.

import java.io.*;
import java.util.*;

public class Main {

	public static void main(String[] args) throws Exception{
//		push X: 정수 X를 스택에 넣는 연산이다.
//		pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
//		size: 스택에 들어있는 정수의 개수를 출력한다.
//		empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
//		top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int n = Integer.parseInt(br.readLine());
		String s;
		int[] arr = new int[n];
		int cnt = 0;
		for(int i = 0; i < n; i++) {
			String[] str = br.readLine().split(" ");
			if(str[0].equals("push")) {
				arr[cnt++] = (Integer.parseInt(str[1]));
			}else {
				switch(str[0]) {
					case "pop":
						if(arr[0] == 0) {
							// 비어있는 경우
							sb.append(-1 + "\n");
						}else {
							sb.append(arr[cnt - 1] + "\n");
							arr[cnt-- - 1] = 0;
						}
						break;
					case "size":
						sb.append(cnt + "\n");
						break;
					case "empty":
						if(arr[0] == 0) {
							// 비어있는 경우
							sb.append(1 + "\n");
						}else {
							sb.append(0 + "\n");
						}
						break;
					case "top":
						if(arr[0] == 0) {
							// 비어있는 경우
							sb.append(-1 + "\n");
						}else {
							sb.append(arr[cnt - 1] + "\n");
						}
						break;
				}
			}
		}
		
		System.out.print(sb);
		br.close();
	}

}

풀이3 - 정답 (Stack 사용)

풀이2에서 배열로 풀이한 문제를 아래와 같이 Stack을 활용해서도 풀이가 가능합니다.

import java.io.*;
import java.util.*;

public class Main {

	public static void main(String[] args) throws Exception{
//		push X: 정수 X를 스택에 넣는 연산이다.
//		pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
//		size: 스택에 들어있는 정수의 개수를 출력한다.
//		empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
//		top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int n = Integer.parseInt(br.readLine());
		String[] str;
		Stack<Integer> stack = new Stack<>();
		for(int i = 0; i < n; i++) {
			str = br.readLine().split(" ");
			if(str[0].equals("push")) {
				stack.push(Integer.parseInt(str[1]));
			}else {
				switch(str[0]) {
					case "pop":
						if(stack.isEmpty()) {
							// 비어있는 경우
							sb.append(-1 + "\n");
						}else {
							sb.append(stack.pop() + "\n");
						}
						break;
					case "size":
						sb.append(stack.size() + "\n");
						break;
					case "empty":
						if(stack.isEmpty()) {
							// 비어있는 경우
							sb.append(1 + "\n");
						}else {
							sb.append(0 + "\n");
						}
						break;
					case "top":
						if(stack.isEmpty()) {
							// 비어있는 경우
							sb.append(-1 + "\n");
						}else {
							sb.append(stack.peek() + "\n");
						}
						break;
				}
			}
		}
		
		System.out.print(sb);
		br.close();
	}

}

팁

Stack

2021.10.14 - [알고리즘/자료구조] - 자료구조 - 스택(Stack)의 정의와 예제

 

자료구조 - 스택(Stack)의 정의와 예제

자료구조(Data Structure)란? 데이터를 표현하고 관리하고 처리하기 위한 구조를 의미한다. 그 중 스택과 큐는 자료구조의 기초 개념으로 다음의 두 핵심적인 함수로 구성된다. 삽입(Push): 데이터를

soo-vely-dev.tistory.com

출처

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

 

반응형

'알고리즘 > Java' 카테고리의 다른 글

[백준] 1158. 요세푸스 문제(Java8)  (0) 2023.01.09
[백준] 10845. 큐(Java8)  (0) 2023.01.04
알고리즘 - 최대공약수 계산(유클리드 호제법) java 예제  (0) 2021.10.23
[백준] 11050.이항 계수 1(Java8)  (0) 2021.10.22
[백준] 2798.블랙잭(Java8)  (0) 2021.10.21
'알고리즘/Java' 카테고리의 다른 글
  • [백준] 1158. 요세푸스 문제(Java8)
  • [백준] 10845. 큐(Java8)
  • 알고리즘 - 최대공약수 계산(유클리드 호제법) java 예제
  • [백준] 11050.이항 계수 1(Java8)
Kim-SooHyeon
Kim-SooHyeon
개발일기 및 알고리즘, 블로그 운영에 대한 글을 포스팅합니다. :) 목표: 뿌리 깊은 개발자 되기
    반응형
  • Kim-SooHyeon
    soo_vely의 개발로그
    Kim-SooHyeon
  • 전체
    오늘
    어제
    • 분류 전체보기 (255)
      • 알고리즘 (108)
        • 자료구조 (3)
        • Java (104)
        • Python (1)
      • Back end (71)
        • Spring Project (28)
        • Java (21)
        • API (1)
        • Python (0)
        • Django (3)
        • Linux (1)
        • 서버 (2)
        • 에러로그 (11)
        • 부스트 코스 (1)
      • Front end (9)
        • HTML, CSS (4)
        • JavaScript (4)
        • JQuery (0)
      • 기타 프로그래밍 (4)
        • Android Studio (1)
        • Arduino (2)
        • Azure Fundamental(AZ-900) (1)
      • 개발도구 (24)
        • IntelliJ (2)
        • Git (12)
        • SVN (0)
        • Eclipse (2)
        • 기타 Tool (8)
      • Database (16)
        • Oracle (10)
        • MySQL (0)
        • H2 Database (3)
        • ORM & JPA (1)
      • 자격증 (10)
        • 컴활 1급 (7)
        • 컴활 2급 (2)
        • SQLD (1)
      • 기타 (13)
        • 블로그 운영 (6)
        • 문서 (1)
        • 기타 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    jpa
    java
    백준 자바
    백준
    Git
    문자열
    구현
    배열
    spring
    단계별풀기
    BOJ
    Oracle
    springboot
    1차원 배열
    백준알고리즘
    for문
    오라클
    solved.ac
    github
    알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Kim-SooHyeon
[백준] 10828. 스택(Java8)
상단으로

티스토리툴바