on
Baekjoon10828: 스택, StringBuilder vs BufferedWriter
Baekjoon10828: 스택, StringBuilder vs BufferedWriter
문제
정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
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을 출력한다
문제 오류?: 한 줄에 하나라고 되어있지만 한 번에 출력해도 정답으로 친다
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+"
"); if(num!=0) {bw.write(arr[num]+"
"); arr[num]="";num--;}break; case"top": if(num==0) bw.write(-1+"
"); if(num!=0) bw.write(arr[num]+"
");break; case"size":bw.write(num+"
");break; case"empty":if(num==0) bw.write(1+"
"); if(num!=0) bw.write(0+"
");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+"
"); if(num!=0) {sb.append(arr[num]+"
"); arr[num]="";num--;}break; case"top": if(num==0) sb.append(-1+"
"); if(num!=0) sb.append(arr[num]+"
");break; case"size":sb.append(num+"
");break; case"empty":if(num==0) sb.append(1+"
"); if(num!=0) sb.append(0+"
");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()+"
"); break; case"top": sb.append(top()+"
");break; case"size": sb.append(num+"
");break; case"empty": sb.append(empty()+"
"); 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()+"
"); break; case"top": sb.append(top()+"
");break; case"size": sb.append(num+"
");break; case"empty": sb.append(empty()+"
"); 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"; }}
from http://devyoseph.tistory.com/83 by ccl(A) rewrite - 2021-10-20 04:02:21