[백준,BOJ 10828] 스택(JAVA 구현)
코테/백준 온라인 저지(BOJ)

[백준,BOJ 10828] 스택(JAVA 구현)

반응형

-풀이

  자료구조 중 LIFO구조인 스택의 기본적인 동작들을 구현하는 문제로, 자바의 경우 배열과 연결 리스트를 활용하여 직접 구현이 가능하며, 별도의 Stack 라이브러리가 제공되어 해당 메서드를 이용해도 된다. 필자는 배열과 라이브러리를 이용해 구현해 보았다. 또, 이 문제에서 주의해야 할 점은 제한시간이 0.5초로 상당히 짧기 때문에, BufferedReader와 BufferedWriter 객체를 사용하는 것이 좋을 것 같다.

 

- 배열을 이용해 직접 Stack 클래스 구현 방법.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

// 스택 클래스
class Stack{
	private int top; // 원소의 위치를 관리 할 top 변수.
	private int stackArr[]; // 배열을 이용한 스택.
	
	public Stack(int size) { // size를 전달해 Stack 객체 생성
		this.top = -1; // 초기에는 값이 없으므로 -1로 시작.
		this.stackArr = new int[size]; // n의 명령이 모두 push일 경우 최대 사이즈는 n.
	}
	
    // push 메소드
	public void push(int x) {
		this.stackArr[++top] = x; // -1인 top의 위치를 증가시킨 후, 삽입.	
	}
	
    // pop 메소드
	public int pop() {
		if(top == -1) return -1; // 삽입되어 있는 원소가 없으면 -1.
		return this.stackArr[top--]; // 원소가 있으면 반환 후, top값을 감소.
	}
	
    // size 메소드
	public int size() {
		return this.top + 1; // top이 0일 때 원소가 1개이기 때문에 +1 후 리턴.		 
	}
	
    // empty 메소드
	public int empty() {
		if(top == -1) return 1; // 원소가 존재하지 않으면 1.
		return 0; // 존재하면 0.
	}
	
    // top 메소드
	public int top() {
		if(top == -1) return -1; // 원소가 존재하지 않으면 -1.
		else return this.stackArr[top]; // 제일 마지막으로 가리키고 있는 원소 반환. top엔 변화 x
	}
}

public class Main { 
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        // 명령어 수.
		int n = Integer.parseInt(br.readLine());
		
        // 명령어 수 크기의 Stack 객체 생성.
		Stack stack = new Stack(n);
		
        // 명령어 수만큼 반복.
		for(int i = 0;i<n;i++) {
            // 명령어 입력.
			String cons = br.readLine();
			
			if(cons.contains("push")) { // push 명령어
				String spt[] = cons.split(" "); // 공백 기준 분할.
				stack.push(Integer.parseInt(spt[1])); // 분할된 정수를 push.
			}else if(cons.contains("pop")) { // pop 명령어
				bw.write(String.valueOf(stack.pop())+"\n"); 
			}else if(cons.contains("size")) { // size 명령어
				bw.write(String.valueOf(stack.size())+"\n");
			}else if(cons.contains("empty")) { // empty 명렁어
				bw.write(String.valueOf(stack.empty())+"\n"); 
			}else if(cons.contains("top")) { // top 명령어
				bw.write(String.valueOf(stack.top())+"\n");
			}
		}
		
		bw.flush();
		bw.close();		
		br.close();
	     
	}

}

- Stack 라이브러리를 이용한 구현방법.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;

public class Main { 
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		int n = Integer.parseInt(br.readLine());
		
        // Stack 객체 생성.
		Stack<Integer> stack = new Stack<>();
		
        // 동일.
		for(int i = 0;i<n;i++) {
			String cons = br.readLine();
			
			if(cons.contains("push")) { // 동일.
				String spt[] = cons.split(" ");
				stack.push(Integer.parseInt(spt[1]));
			}else if(cons.contains("pop")) { // 동일.
				if(stack.empty()) bw.write(-1+"\n"); // 별도의 empty() 체크가 필요하다.			
				else bw.write(stack.pop()+"\n");			
			}else if(cons.contains("size")) { // 동일.
				bw.write(stack.size()+"\n");
			}else if(cons.contains("empty")) { // 동일.
				if(stack.empty()) bw.write(1+"\n"); // 별도의 empty() 체크가 필요하다.	
				else bw.write(0+"\n");
			}else if(cons.contains("top")) { // 동일.
				if(stack.empty())bw.write(-1+"\n");	// 별도의 empty() 체크가 필요하다.									
				else bw.write(stack.peek()+"\n");
			}
		}
		
		bw.flush();
		bw.close();		
		br.close();
	     
	}

}

 

  두 방법 모두 사용상에 큰 어려움은 없다.

반응형