Study/Baekjoon

Baekjoon10828: 스택, StringBuilder vs BufferedWriter

devyoseph 2021. 10. 20. 03:27

문제

정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 다섯 가지이다.

  • 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)의 개념과 사용법

스택 먼저 들어온것이 나중에 나오는 자료 LIFO(Last In First Out) 상황으로 이해 짱구아빠는 a라는 일을 하고 있다 이 일을 마치기 전에 b라는 일을 해달라고 연락이 왔다 b를 마치기 전에 c라는 일을

devyoseph.tistory.com

*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