https://www.acmicpc.net/problem/10828
스택은 first in last out으로 블럭 쌓기라고 생각하시면 됩니다.
블럭을 쌓는데 아래부터 차곡차곡 쌓이는 것이라고 보면 됩니다.
반대로 쌓인 블럭을 정리하기 위해서는 위에서 부터 하나하나 빼줘야 합니다.
제가 작성한 코드를 보고 설명드리겠습니다.
전체코드
import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Stack<Integer> stack = new Stack<>();
int n = sc.nextInt();
for(int i=0; i<=n; i++){
String s = sc.nextLine();
if (s.indexOf("push") != -1) {
String pushNum = s.split("push ")[1];
int num = Integer.parseInt(pushNum);
stack.push(num);
} else if (s.indexOf("top") != -1){
if (stack.empty() == true){
System.out.println("-1");
} else {
Integer pop = stack.pop();
System.out.println(pop);
stack.push(pop);
}
} else if (s.indexOf("size") != -1){
System.out.println(stack.size());
} else if (s.indexOf("empty") != -1){
if (stack.empty() == true){
System.out.println("1");
} else {
System.out.println("0");
}
} else if (s.indexOf("pop") != -1){
if (stack.empty() == true){
System.out.println("-1");
} else {
System.out.println(stack.pop());
}
}
}
}
}
Scanner sc = new Scanner(System.in);
Stack<Integer> stack = new Stack<>();
int n = sc.nextInt();
입력은 스캐너로 입력받았습니다.
스택을 하나 만들어줍니다.
n개의 정수를 입력을 받았습니다.
for(int i=0; i<=n; i++){
String s = sc.nextLine();
}
n만큼 반복을 합니다.
예제에 push 1 처럼 push와 1 사이에 공백이 있으므로 한 줄로 받아야되니 때문에 nextLine()을 사용하였습니다.
반복문 안쪽 내용입니다.
if (s.indexOf("push") != -1) {
String pushNum = s.split("push ")[1];
int num = Integer.parseInt(pushNum);
stack.push(num);
}
s라는 문자열에 "push" 라는 문자열이 존재하는지 체크합니다. -1이 아니기 때문에 push 라는 문자열이 존재하므로
split을 이용하여 "push " 라는 문자열을 나눈 후 [1] 번째 인덱스를 가져옵니다. 즉, push 1 이면 1을 가져오게 됩니다.
문자열을 Integer.parseInt 를 사용해 정수로 바꿔주었습니다.
stack에 해당 정수를 push 해서 쌓았습니다.
else if (s.indexOf("top") != -1){
if (stack.empty() == true){
System.out.println("-1");
} else {
Integer pop = stack.pop();
System.out.println(pop);
stack.push(pop);
}
다음은 "top" 문자열을 입력받았을 경우 입니다.
stack.empty() 를 사용해 비어있는지를 체크합니다.
비어있으면 true를 반환하기 때문에 비어있으면 -1를 출력합니다.
비어있지 않으면 제일 위에 쌓인 블럭을 출력해야 되므로 pop를 이용해 제일 위에 있는 블럭을 정리해 줍니다.
그 정리된 블럭을 출력하고 push를 통해 다시 쌓아줍니다.
else if (s.indexOf("size") != -1){
System.out.println(stack.size());
}
"size"의 경우는 stack.size를 통해 바로 출력해줍니다.
사이즈를 반환해주는 메소드입니다.
else if (s.indexOf("empty") != -1){
if (stack.empty() == true){
System.out.println("1");
} else {
System.out.println("0");
}
}
"empty" => 비어있는지 확인하는 문자열입니다.
스택이 비어있으면 1을 출력하고 그렇지 않으면 0을 출력합니다.
else if (s.indexOf("pop") != -1){
if (stack.empty() == true){
System.out.println("-1");
} else {
System.out.println(stack.pop());
}
}
마지막으로 "pop"입니다.
쌓인 블럭에 제일 위에있는 블럭을 제거하는 것입니다.
하지만, 블럭이 없을 경우가 존재하기 때문에 스택이 비어있을 경우 -1을 출력하고
블럭이 있을 경우에는 제일 위에 블럭을 제거하고 출력해줍니다.
시간 초과... 문제가 발생했습니다...
저는 Scanner 부분을 BufferedReader로 바꾸어 시간초과 문제를 해결했습니다.
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 bufferedReader = new BufferedReader(new InputStreamReader(System.in));
Stack<Integer> stack = new Stack<>();
int n = Integer.parseInt(bufferedReader.readLine());
StringTokenizer stringTokenizer;
for(int i=0; i<n; i++){
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
String s = stringTokenizer.nextToken();
if (s.indexOf("push") != -1) {
int num = Integer.parseInt(stringTokenizer.nextToken());
stack.push(num);
} else if (s.indexOf("top") != -1){
if (stack.empty() == true){
System.out.println("-1");
} else {
Integer pop = stack.pop();
System.out.println(pop);
stack.push(pop);
}
} else if (s.indexOf("size") != -1){
System.out.println(stack.size());
} else if (s.indexOf("empty") != -1){
if (stack.empty() == true){
System.out.println("1");
} else {
System.out.println("0");
}
} else if (s.indexOf("pop") != -1){
if (stack.empty() == true){
System.out.println("-1");
} else {
System.out.println(stack.pop());
}
}
}
}
}
int n = Integer.parseInt(bufferedReader.readLine());
n개의 정수를 입력받는 부분을 변경하였고
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
String s = stringTokenizer.nextToken();
stringTokenizer를 사용해 입력되는 문자열을 입력 받았습니다.
if (s.indexOf("push") != -1) {
int num = Integer.parseInt(stringTokenizer.nextToken());
stack.push(num);
}
"push"에 경우 쌓아야되는 블럭의 정수 값과 "push" 사이에 공백이 존재하기 때문에
stringTokenizer를 생성했을 때 아무 조건을 주지 않았으므로 공백을 기준으로 토큰이 나누어집니다.
그래서 nextToken을 통해 정수 값을 가져와주면 됩니다.
"push 1" 경우 첫번째 토큰 push, 두번째 토큰 1이 된 것입니다.
정답처리가 완료되었습니다.
많은 풀이 방법이 존재합니다.
제가 풀이한 방법만이 정답은 아닙니다.
'알고리즘 with JAVA' 카테고리의 다른 글
백준 4949번 균형잡힌 세상 (JAVA) (0) | 2022.05.24 |
---|---|
백준 10773번: 제로 문제 (JAVA) 스택문제 (0) | 2022.05.18 |
JAVA 소수 구하기 - 에라토스테네스의 체 (0) | 2021.08.08 |
파보나치 수열 - Java 간단한 풀이 (0) | 2021.08.07 |
문자열 압축 알고리즘 - 자바 .with 주의사항 (0) | 2021.06.07 |