- 문제 출처 : https://www.acmicpc.net/problem/10828
1. 생각
두번째로 Java로 푸는 백준 알고리즘 문제이다.
스택 자료구조를 완벽하게 적응하기 위해 이전 문제와 동일하게 스택 문제를 선택했다.
이전 괄호문제에서는 String을 문자 하나하나 확인하여 스택을 활용했다면,
이번에는 String 자체를 비교하여 명령을 구분하고 처리하는 과정을 거치는 문제이다.
2. 난관 & 해결 방법
public static int top;
public static int[] stack = new int[10000];
이전과 동일하게, stack의 가장 윗부분 index를 top으로 설정하고,
stack을 10000개 크기로 할당해줬다.
(명령의 수가 10000개 까지 들어올 수 있기에, push 가능한 최대치로 설정.)
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
main문의 상단에서는 새로 알게 된 입력방식을 사용했다.
이전에 썼던 Scanner는 버퍼 사이즈가 1kb라 입력 속도가 굉장히 길어져 문제가 될 수 있었는데,
BufferedReader는 버퍼 사이즈가 8kb라 입력 받는데에 더 빠르게 수행한다고 한다.
또한 Scanner는 내부적으로 더 딜레이가 있다고 하여,
실행속도 제한이 있는 코딩 테스트 문제를 풀때는 더더욱
BufferedReader 방식으로 입력을 받아야 하는 것을 알게 되었다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
위처럼 초기화를 진행하는데, System.in 을 InputStreamReader 를 이용해 Char 단위로 읽은 후
BufferedReader 로 버퍼에 담는 방식이라고 한다.
데이터 라인 단위로 읽기 위해 readLine()을 사용하며,
String으로 라인 하나를 반환해준다.
ex) String s = br.readLine()
항상 라인 단위로 입력값의 경계를 인식하기 때문에 늘 String으로 인식하며,
정수나 다른 타입으로 사용하기 위해서는 형변환이 필요하다고 한다.
위 코드에서는 받을 명령어 개수를 입력하기 위해 int로 형변환을 해주었다.
ex) Integer.parseInt(br.readLine())
for (int i = 0; i < n; i ++){
String[] str = br.readLine().split(" ");
if (str[0].equals("push"))
push(Integer.parseInt(str[1]));
else if (str[0].equals("pop"))
System.out.println(pop());
else if (str[0].equals("size"))
System.out.println(top);
else if (str[0].equals("empty"))
isEmpty();
else if (str[0].equals("top")) {
if (top == 0) {
System.out.println("-1");
} else {
System.out.println(stack[top - 1]);
}
}
}
이후 for문을 거쳐서 명령어를 받는 코드를 작성했다.
push의 경우 명령어가 push 5, push 2 .. 처럼 공백을 사이에 두고 필요한 값이 주어지므로,
해당 케이스에서는 문자열 하나를 쪼개줄 필요가 있었다.
따라서 split()이라는 문자열을 나눠주는 메소드를 사용하여
받아온 readLine 한 줄을 String 배열에 저장해줬다.
그 후, 나눈 문자열의 0번째 배열에 든 명령어를 기반으로 if문에 판별하도록 만들어줬고
push에 한해서 1번째 배열에 든 숫자를 Integer.parseInt()로 int화 하여 넘겼다.
static void push(int n){
stack[top] = n;
top ++;
}
static int pop(){
if (top == 0)
return (-1);
top --;
return (stack[top]);
}
static void isEmpty(){
if (top == 0)
System.out.println("1");
else
System.out.println("0");
}
기능적인 부분에서는 이전 문제와 동일하게 쉽게 짤 수 있었다.
3. 코드 및 결론
[ 전체 코드 ]
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static int top;
public static int[] stack = new int[10000];
static void push(int n){
stack[top] = n;
top ++;
}
static int pop(){
if (top == 0)
return (-1);
top --;
return (stack[top]);
}
static void isEmpty(){
if (top == 0)
System.out.println("1");
else
System.out.println("0");
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
top = 0;
int n = Integer.parseInt(br.readLine());
for (int i = 0; i < n; i ++){
String[] str = br.readLine().split(" ");
if (str[0].equals("push"))
push(Integer.parseInt(str[1]));
else if (str[0].equals("pop"))
System.out.println(pop());
else if (str[0].equals("size"))
System.out.println(top);
else if (str[0].equals("empty"))
isEmpty();
else if (str[0].equals("top")) {
if (top == 0) {
System.out.println("-1");
} else {
System.out.println(stack[top - 1]);
}
}
}
}
}
[ 결론 ]
처음으로 BufferedReader 활용을 해본 문제였다.
자료구조에 대한 깊은 공부보다는 java에 익숙해지는 단계인 것 같다.
다음 문제부터는 조금 더 자료구조를 익히고 알고리즘을 활용할 수 있는 문제를 풀어봐야겠다.
'프로그래밍 > Algorithm' 카테고리의 다른 글
[BOJ] 백준 2164번: 카드 2 (C++) (0) | 2025.04.07 |
---|---|
[BOJ] 백준 18258번: 큐 2 (C++) (0) | 2025.04.07 |
[BOJ] 백준 4949번: 균형잡힌 세상 (C++) (0) | 2025.04.06 |
[BOJ] 백준 10773번: 제로 (C++) (0) | 2025.04.06 |
[BOJ] 백준 9012번: 괄호 (JAVA) (0) | 2025.04.04 |