문제
정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
- push X: 정수 X를 스택에 넣는 연산이다.
- pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- size: 스택에 들어있는 정수의 개수를 출력한다.
- empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
- top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
입력
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.
출력
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.
풀이
스택은 먼저 들어간 자료가 가장 나중에 나오는 LIFO(Last In First Out) 형태이다.
제한조건: 주어지는 숫자는 1 이상이다. 이것은 배열 기본 생성 시 기본값인 0을 '빈공간'으로 사용할 수 있다고 해석할 수 있다
1) 명령의 수 = N+1의 크기만큼 배열의 크기를 만든다
2) 스택에 들어있는 자료의 양을 표현하는 변수(num)을 설정한다, 전역변수로 만들어서 관리한다
3) switch로 만들어본다
→ switch(st.nextToken())을 통해 어떤 명령인지 확인 후 처리한다
→ push: num을 1증가시키고 다음 입력값을 배열의 index(num)에 넣는다
pop[출력]: 현재 index(num)에 해당하는 숫자를 출력하고 num에 -1을 한다. num=0이면 -1을 출력한다
top[출력]: 스택 가장 위에 있는 정수를 출력한다(num의 index). num이 0이면 -을 출력한다
size[출력]: 현재 num을 출력한다
empty[출력]: 현재 num이 0이면 1, 0이 아니면 0을 출력한다
문제 오류?: 한 줄에 하나라고 되어있지만 한 번에 출력해도 정답으로 친다
*java에서 지원하는 Stack 메소드 관련 포스팅
Stack Class 활용
import java.io.*;
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));
Stack<Integer> stack = new Stack<Integer>();
StringTokenizer st;
for(int i = Integer.parseInt(br.readLine()); i>0; i--) {
st = new StringTokenizer(br.readLine()," ");
switch(st.nextToken()) {
case"push": stack.push(Integer.parseInt(st.nextToken())); break;
//stack 내부 push메소드 이용
case"pop": System.out.println(stack.isEmpty()?-1:stack.pop()); break;
//stack 내부 isEmpty 메소드 이용, 맞다면 -1을 출력하고 아니면 pop메소드
case"top": System.out.println(stack.isEmpty()?-1:stack.peek()); break;
//peek메소드는 문제에서 주어진 top메소드와 같다
case"size": System.out.println(stack.size()); break;
//size메소드 사용
case"empty": System.out.println(stack.isEmpty()?1:0); break;
}}}}
BufferedWriter
import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int num=0;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
String[] arr = new String[N+1];
while(N-- >0) {
st = new StringTokenizer(br.readLine(), " ");
switch(st.nextToken()) {
case"push":num++; arr[num]=st.nextToken(); break;
case"pop": if(num==0) bw.write(-1+"\n");
if(num!=0) {bw.write(arr[num]+"\n"); arr[num]="";num--;}break;
case"top": if(num==0) bw.write(-1+"\n");
if(num!=0) bw.write(arr[num]+"\n");break;
case"size":bw.write(num+"\n");break;
case"empty":if(num==0) bw.write(1+"\n");
if(num!=0) bw.write(0+"\n");break;
}
}
bw.flush();
bw.close();
//한번에 출력해도 정답으로 처리된다
}}
StringBuilder
import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int num=0;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
String[] arr = new String[N+1];
while(N-- >0) {
st = new StringTokenizer(br.readLine(), " ");
switch(st.nextToken()) {
case"push":num++; arr[num]=st.nextToken(); break;
case"pop": if(num==0) sb.append(-1+"\n");
if(num!=0) {sb.append(arr[num]+"\n"); arr[num]="";num--;}break;
case"top": if(num==0) sb.append(-1+"\n");
if(num!=0) sb.append(arr[num]+"\n");break;
case"size":sb.append(num+"\n");break;
case"empty":if(num==0) sb.append(1+"\n");
if(num!=0) sb.append(0+"\n");break;
}
}
System.out.print(sb.toString());
}}
*BufferedWriter가 시간이 좀 더 빠르다
Method + 정수배열
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static int[] arr;
public static int num=0;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
arr = new int[N];
while(N-- >0) {
st = new StringTokenizer(br.readLine(), " ");
switch(st.nextToken()) {
case"push": push(Integer.parseInt(st.nextToken())); break;
case"pop": sb.append(pop()+"\n"); break;
case"top": sb.append(top()+"\n");break;
case"size": sb.append(num+"\n");break;
case"empty": sb.append(empty()+"\n"); break; } }
System.out.print(sb.toString());
}
public static void push(int n) {
num++;
arr[num] = n;
}
public static int pop() {
int p;
if(num==0) p=-1;
else { p=arr[num];
arr[num]=0;
num--;
}
return p;
}
public static int top() {
if(num==0) return -1;
else{return arr[num];}
}
public static int empty() {
if(num==0) return 1;
else return 0;
}}
Method + 문자열 배열
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static String[] arr;
public static int num=0;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
arr = new String[N];
while(N-- >0) {
st = new StringTokenizer(br.readLine(), " ");
switch(st.nextToken()) {
case"push": push(st.nextToken()); break;
case"pop": sb.append(pop()+"\n"); break;
case"top": sb.append(top()+"\n");break;
case"size": sb.append(num+"\n");break;
case"empty": sb.append(empty()+"\n"); break;
} }
System.out.print(sb.toString());
}
public static void push(String s) {
num++;
arr[num] = s;
}
public static String pop() {
String s;
if(num==0) s= "-1";
else {s= arr[num];
arr[num]="";
num--;}
return s;
}
public static String top() {
if(num==0) return "-1";
else{return arr[num];}
}
public static String empty() {
if(num==0) return "1";
else return "0";
}}
'Study > Baekjoon' 카테고리의 다른 글
Baekjoon9012: 괄호 (0) | 2021.10.20 |
---|---|
Baekjoon10773: 제로 (0) | 2021.10.20 |
Baekjoon1436: 영화감독 숌 (0) | 2021.10.19 |
Baekjoon1018*: 체스판 다시 칠하기 (0) | 2021.10.18 |
Baekjoon7568: 덩치 (0) | 2021.10.18 |