반응형
문제
예제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)의 정의와 예제
출처
반응형
'알고리즘 > 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 |