문제

문제를 이해하기만 하면 스택을 사용해 쉽게 풀이할 수 있는 문제인 듯 하다.
예제를 기준으로 설명해 보자. 4를 입력받았을 때 1부터 4까지 스택에 오름차순으로 push하고, 이때 스택의 top에 만들어야 하는 수열의 요소인 4가 있으므로 pop한다. 다음으로 3이 입력되지만, 앞선 입력으로 3까지의 수는 이미 스택에 삽입된 바 있기 때문에 이번에는 1부터 3까지 오름차순으로 push하는 작업 없이 바로 스택 top에 3이 있는지 확인한다. top에 3이 있으므로 이를 pop하고 다음 입력으로 넘어간다. 6을 입력받아 이전에 삽입된 적 없는 5와 6을 push하고 위와 같은 과정을 반복해 주면 예제와 같은 출력이 완성된다.
도식적으로 표현하면 아래와 같다.

풀이
직전에 push한 요소의 다음 요소부터 오름차순으로 push해야 하므로, 어디까지 입력되었는지 표시할 변수 index를 사용한다.
if(index<num) { //추가로 push해야 한다면
for(int j=index+1; j<num+1; j++) {
stack.push(j);
sb.append("+").append("\n");
}
index=num;
}
num은 이번에 만들어야 할 배열의 수이고, index는 직전에 입력받은 수일 때(직전에 push된 값이므로 index+1부터 push 새로 push해야 한다), index가 num보다 작을 경우 지난 push에 이어 추가로 push해야 하므로 index+1부터 num까지 스택에 push해준 뒤 index를 num으로 변경하여 다음 push를 이어갈 수 있게 한다.
else if(stack.peek()!=num) { //top의 요소가 입력값과 다를 경우 배열을 만들 수 없음
System.out.println("NO");
return;
}
이번에 입력받은 num이 이전에 push된 적 있어 새롭게 push할 필요가 없는 경우, top이 num과 다르다면 배열을 구성할 수 없으므로 NO를 출력하고 return으로 전체 반복문을 종료한다.
stack.pop();
sb.append("-").append("\n");
top이 num과 같을 경우 pop한다.
전체 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb=new StringBuilder();
Stack<Integer> stack=new Stack<>();
int n=Integer.parseInt(br.readLine());
int index=0;
for(int i=0; i<n; i++) {
int num=Integer.parseInt(br.readLine());
if(index<num) {
for(int j=index+1; j<num+1; j++) {
stack.push(j);
sb.append("+").append("\n");
}
index=num;
}
else if(stack.peek()!=num) {
System.out.println("NO");
return;
}
stack.pop();
sb.append("-").append("\n");
}
System.out.println(sb);
}
}
BufferedReader와 StringBuilder를 사용해 풀이했다.
'백준' 카테고리의 다른 글
백준 9372: 상근이의 여행(java) (0) | 2024.08.19 |
---|---|
백준 1463: 1로 만들기(java) (0) | 2024.08.09 |
백준 5397: 키로거(java) (0) | 2024.08.07 |
백준 1302: 베스트셀러(java) (0) | 2024.08.07 |
백준 1065: 한수(java) (0) | 2024.08.02 |