1874 스택 수열
https://www.acmicpc.net/problem/1874
문제설명
- N개의 정수가 주어지며, 이 정수들은 1부터 N까지의 자연수이다.
- 스택을 이용해 주어진 수열을 만들 수 있도록 '+' (push) 및 '-' (pop) 연산을 수행한다.
- 만약 수열을 만들 수 없다면 "NO"를 출력한다.
접근방식
O(N) 시간복잡도
- Stack은 상수 시간복잡도가 소요되고
- 각 수에 대해 최대 한 번씩 스택에 값을 push하거나 pop할 수 있으므로, N개의 수를 처리하는데 O(N)의 시간이 걸린다.
문제 조건 분석 과정
- 스택 초기화: 스택을 생성하고, 입력 수열을 처리할 변수들을 초기화한다.
- 입력 읽기: 주어진 수열의 각 값을 읽어온다.
- 스택 조작:
- 만약 현재 값이 start (가장 최근에 스택에 넣은 값)보다 크면, 그 사이의 모든 수를 스택에 넣고 '+' 연산을 기록한다.
- 현재 값이 스택의 최상위 값과 일치하지 않으면 수열을 만들 수 없으므로 "NO"를 출력한다.
- 그렇지 않으면, 스택에서 값을 제거하고 '-' 연산을 기록한다.
- 결과 출력: 모든 연산이 성공적으로 수행되었다면, 기록된 연산을 출력한다.
전체코드
import java.util.*;
import java.io.*;
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 start = 0;
for (int i = 0; i < N; i++) {
int value = Integer.parseInt(br.readLine());
if (value > start) {
for (int j = start + 1; j <= value; j++) {
stack.push(j);
sb.append('+').append('\n');
}
start = value;
}
if (stack.isEmpty() || stack.peek() != value) {
System.out.println("NO");
return;
}
stack.pop();
sb.append('-').append('\n');
}
System.out.println(sb);
}
}
'자료구조 > 문제풀이' 카테고리의 다른 글
[백준 JAVA] 12933 오리 (0) | 2024.09.25 |
---|---|
[백준 JAVA] 2812 크게 만들기 (0) | 2024.09.25 |
[백준 JAVA] 20006 랭킹전 대기열 (0) | 2024.09.23 |
[백준 JAVA] 1759 암호 만들기 (0) | 2024.09.23 |
[백준 JAVA] 4485 녹색 옷 입은 애가 젤다지? (0) | 2024.09.23 |