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