hahn

단계별로 풀어보기(스택 - 스택) 본문

코딩테스트 연습/백준(JAVA)

단계별로 풀어보기(스택 - 스택)

hahn 2021. 9. 17. 12:47
728x90
반응형

 

10828번: 스택 (acmicpc.net)

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

http://boj.kr/82fcd1e8de454f36a91fee19e65c3579

 

공유 소스 보기

 

www.acmicpc.net

더보기
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

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 commandCount = Integer.parseInt(br.readLine()),
			point = -1;
		
		StringTokenizer st;
		
		List<Integer> arr = new ArrayList<Integer>();
		
		for(int i = 0; i < commandCount; i++) {
			
			st = new StringTokenizer(br.readLine(), " ");
			
			switch(st.nextToken()) {
			
			case "push":
			
				point++;
				arr.add(Integer.parseInt(st.nextToken()));
				break;
				
			case "pop":
				
				if(point == -1) {
					
					bw.write(String.valueOf(-1));
					bw.newLine();
					
				}else {
					
					bw.write(String.valueOf(arr.remove(point)));
					point--;
					bw.newLine();
					
				}
				
				break;
				
			case "size":
				
				bw.write(String.valueOf(point + 1));
				bw.newLine();
				break;
				
			case "empty":
				
				if(arr.isEmpty()) {
					
					bw.write(String.valueOf(1));
					bw.newLine();
					
				}else {
					
					bw.write(String.valueOf(0));
					bw.newLine();
					
				}
				
				break;
				
			case "top":
				
				if(point == -1) {
					
					bw.write(String.valueOf(-1));
					bw.newLine();
					
				}else {
					
					bw.write(String.valueOf(arr.get(point)));
					bw.newLine();
					
				}
				
				break;
				
			}
				
			
		}
		
		bw.close();
        
    }
    
}

 

일단 스택의 크기가 정해져 있는 건 아니니까 ArrayList 이용했다.

 

인덱스는 point로 각 command의 설명에 따라 증감했다.

 

처음에는 for문으로 분기처리하여 했는데

 

이걸 하면서 생각한 게 자바는 객체지향인데

 

다음부터는 객체지향으로 만들 필요가 있다고 생각했다.

 

sysout으로 찍어봤는데 답은 잘 나오지만

 

시간 초과가 떠서 이를 어떻게 해결할까 고민했다.

 

BufferedReader로 교체하면서

 

push 때문에 split을 해야 할 상황이 생겼는데

 

String []을 이용하기에는 뭔가 좀 꺼려져서

(물론 구현은 할 수 있다)

 

Botherahn :: [JAVA] StringTokenizer (tistory.com)

 

[JAVA] StringTokenizer

문제 상황 스택 구현하다가 시간제한 때문에 Scanner에서 BufferedReader로 교체하려 하는데 push 1 push 2 이런 식으로 입력이 들어올 때가 문제였다. top size empty pop pop pop size empty pop 다른 입력은 이..

ahnstu.tistory.com

 

얘를 찾아서 응용했다.

 

문제는 if문 조건 처리할 때 조건문마다

 

st.nextToken()를 넣으면 당연하게 

 

NoSuchElementException 에러가 난다.

 

물론 String에 새로 담아서 조건 처리할 수 있지만

 

그냥 switch문을 사용해서 코드 작성하고 제출했더니 성공

728x90
반응형

'코딩테스트 연습 > 백준(JAVA)' 카테고리의 다른 글

단계별로 풀어보기(큐, 덱 - 큐 2)  (0) 2021.09.17
[백준 - JAVA] 큐  (0) 2021.09.17
[백준 - JAVA] 쉽게 푸는 문제  (0) 2021.09.17
[백준 - JAVA] 30  (0) 2021.09.17
[백준 - JAVA] 별 찍기 - 23  (0) 2021.09.17