-
[백준/BOJ] 10828번 : 스택 (JAVA / 자바)백준 2022. 3. 3. 23:32
안녕하세요~ 코딩하는 코알못 코메인입니다.
https://www.acmicpc.net/problem/10828
- 문제 -
난이도 실버 4 문제이다.
자바에서 입력방식은 scanner와 bufferedreader가 있다.
자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.
bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.
더 자세한 내용은 아래 글 참고 하면 좋다.
풀이 방법
두가지 방법으로 풀어볼 것이다.
1. 스택 클래스를 그대로 가져다 쓰는 방법
2. 스택을 배열로 직접 구현하는 방법
아마 문제의 궁극적 목표는 2번 방법이 아닐까 싶다.
1번에서 그대로 가져다 쓴다곤 했지만, 그정 불러오기만하면 당연 틀린다. 문제를 보면 pop, top이 입력될때 비어 있으면 -1을 출력한다고 한다. 이건 그냥 그대로 쓰면 당연 틀린다. 없을때 pop이나 peek을 하게되면 에러가 나오기 때문이다. 비어있을때의 조건을 추가하자. empty도 그냥 출력하면 0과 1이 나오지만 문제에서 원하는건 반대이다. 비어있을때 1 있을때 0이다.
2번은 위의 조건들을 만족하게끔 스택 구조를 배열로 만들어서 푼다.
공통적으로 StringBuilder를 사용해 출력해준다.
코드로 보자.
-풀이-
1. 스택 클래스를 그대로 사용
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; 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)); int N = Integer.parseInt(br.readLine()); Stack<Integer> stack = new Stack<Integer>(); StringBuilder sb = new StringBuilder(); for(int i = 0; i < N; i++) { StringTokenizer st = new StringTokenizer(br.readLine()); String S = st.nextToken(); //여기선 if로 했지만 스위치로 하는게 더 깔끔하다. if(S.equals("push")) stack.push(Integer.parseInt(st.nextToken())); else if(S.equals("pop")) { if(!stack.empty()) sb.append(stack.pop()).append("\n"); else sb.append(-1).append("\n"); }else if(S.equals("size")) { sb.append(stack.size()).append("\n"); }else if(S.equals("empty")) { if(!stack.empty()) sb.append(0).append("\n"); else sb.append(1).append("\n"); }else { if(!stack.empty()) sb.append(stack.peek()).append("\n"); else sb.append(-1).append("\n"); } } System.out.println(sb); } }
2. 배열로 스택 직접 구현
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { static int[] stack = new int[10001]; static int size; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); StringBuilder sb = new StringBuilder(); for(int i = 0; i < N; i++) { StringTokenizer st = new StringTokenizer(br.readLine()); String S = st.nextToken(); switch (S) { case "push" : push(Integer.parseInt(st.nextToken())); break; case "pop" : sb.append(pop()).append("\n"); break; case "size" : sb.append(size()).append("\n"); break; case "empty" : sb.append(empty()).append("\n"); break; case "top" : sb.append(top()).append("\n"); break; } } System.out.println(sb); } public static void push(int num) { stack[size] = num; size++; } public static int pop() { if(size == 0) return -1; else { int P = stack[size - 1]; size--; return P; } } public static int size() { return size; } public static int empty() { if(size == 0) return 1; else return 0; } public static int top() { if(size == 0) return -1; else { int T = stack[size - 1]; return T; } } }
-결과-
아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수분들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠습니다.
'백준' 카테고리의 다른 글
[백준/BOJ] 10866번 : 덱 (JAVA / 자바) (0) 2022.03.05 [백준/BOJ] 10845번 : 큐 (JAVA / 자바) (0) 2022.03.05 [백준/BOJ] 10816번 : 숫자 카드 2 (JAVA / 자바) (0) 2022.03.03 [백준/BOJ] 10773번 : 제로 (JAVA / 자바) (0) 2022.03.01 [백준/BOJ] 9012번 : 괄호 (JAVA / 자바) (0) 2022.03.01