문제 풀이 날짜: 2023.05.23
포스트 작성일: 2023.05.25
* 학습 목적으로 작성하는 글입니다. 풀이가 정석적이지 못할 수도 있습니다.
문제 출처
백준 온라인 저지 1874번: 스택 수열 (실버2) (문제 링크)
키워드
스택
풀이 접근법
- 1부터 n까지의 수를 탐색하며 적절한 타이밍에 push & pop 해주는 문제이다.
- 현재 탐색하는 수가 target이라고 할때, 1부터 target까지 스택에 push된 적 없다면 push한다.
- target이 j보다 크면(>) 스택에 수를 넣을 건데, j가 1부터 시작하는 데다가 target까지 1이라면 스택에 수를 넣을 수 없게 됨. 따라서 등호를 추가해야 한다.
- 1부터 target 이상의 수가 이미 스택에 push된 적이 있는데, 그것보다 작은 수를 push해야 한다면 이것은 스택으로 구현될 수 없는 순서이다.
- target과 스택 최상단(stack.peek())의 수가 동일하다면 스택에서 꺼낸다. (pop)
- 현재 탐색하는 수가 target이라고 할때, 1부터 target까지 스택에 push된 적 없다면 push한다.
- 연달아 pop했을 때, 이 수들을 늘어놓으면 반드시 내림차순이다.
- 예: 1, 2, 3, 4를 push하고 pop을 두 번 하면 내림차순 4, 3을 얻는다.
- 내림차순이 성립하지 않으면 다른 수를 push한 다음에 pop한 것이다.
- 예: 4, 3, 6, 8, 7이 있을 때, 4, 3까지 pop을 하고 6을 push한다.
- 6을 pop하고 7, 8을 push한다.
- 그 다음에는 8, 7을 pop한다.
코드
import java.io.*;
import java.util.*;
public class Main {
private static Stack<Integer> stack = new Stack<>();
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] targets = new int[N];
for(int i = 0; i < N; i++) {
targets[i] = Integer.parseInt(br.readLine());
}
StringBuilder sb = new StringBuilder();
boolean isValid = true;
int i = 0;
int j = 1;
while(i < targets.length || j <= N) {
int target = targets[i];
//반복문이 시작되자마자 push를 하기 때문에 isEmpty()를 고려하지 않아도 됨.
if(target >= j) {
while(j <= target) {
stack.push(j);
sb.append("+").append('\n');
j++;
}
}
else if(Objects.equals(stack.peek(), target)) {
stack.pop();
sb.append("-").append('\n');
i++;
}
else {
isValid = false;
break;
}
}
if(isValid) {
System.out.print(sb);
}
else {
System.out.print("NO");
}
}
}
실버 등급이지만 조건 구현이 조금 까다롭게 느껴지는 문제였다. 처음에는 target >= j의 등호를 빼먹어서 틀리기도 했다. 특히 주의해야 할 점이 있었는데, stack에서 뽑은 수는 primitive type인 int가 아니라 Integer 타입이기 때문에 비교할 때는 equals()를 사용하는 게 더 정확하다.
git 링크
https://github.com/jinju9553/23-CodingTest/blob/main/week9/day2/Q1874.java
'Study > Problem Solving' 카테고리의 다른 글
[백준 / Java] 10971번: 외판원 순회2 (실버2) (0) | 2023.05.25 |
---|---|
[SWEA / Java] 1859번: 백만 장자 프로젝트 (D2) (0) | 2023.05.25 |
[백준 / Java] 4949번: 균형잡힌 세상 (실버4) (0) | 2023.05.24 |
[백준 / Java] 2565번: 전깃줄 (골드5) (0) | 2023.05.23 |
[백준 / Java] 1541번: 잃어버린 괄호 (실버2) (0) | 2023.05.23 |