https://www.acmicpc.net/problem/17299
π μλ°(Java)λ‘ νΈλ μ€λ±ν°μ λ¬Έμ νμ΄
π λ¬Έμ κ°μ
μ£Όμ΄μ§ μμ΄μμ κ° μ«μμ λ±μ₯ νμλ₯Ό κ³ λ €νμ¬ μ€λ₯Έμͺ½μμ κ°μ₯ κ°κΉμ΄ "λ μμ£Ό λ±μ₯ν μ«μ"λ₯Ό μ°ΎμμΌ νλ λ¬Έμ μ
λλ€.
μΌλ°μ μΈ μ€ν°μ(NGE, Next Greater Element) λ¬Έμ μ λ¬λ¦¬ "μ«μμ ν¬κΈ°"κ° μλ "λ±μ₯ νμ"λ₯Ό κΈ°μ€μΌλ‘ λΉκ΅νλ€λ μ μ΄ λ€λ¦
λλ€.
π‘ μμ μ λ ₯
7
1 1 2 3 4 2 1
π‘ μμ μΆλ ₯
-1 -1 1 2 2 1 -1
μ μμ μμ κ° μ«μμ λ±μ₯ νμλ₯Ό 보면:
- 1 → 3λ² λ±μ₯
- 2 → 2λ² λ±μ₯
- 3 → 1λ² λ±μ₯
- 4 → 1λ² λ±μ₯
κ° μ«μμ λν΄ μ€λ₯Έμͺ½μμ λ μμ£Ό λ±μ₯ν μ«μλ₯Ό μ°ΎμΌλ©΄ μμ κ°μ κ²°κ³Όκ° λμ΅λλ€.
π μκ³ λ¦¬μ¦ μ κ·Ό λ°©μ
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μ€ν(Stack) κ³Ό λ°°μ΄(Hash Table) μ νμ©ν©λλ€.
- μ«μμ λ±μ₯ νμλ₯Ό λ¨Όμ ꡬνλ€.
- μ€λ₯Έμͺ½μμ μΌμͺ½μΌλ‘ μ«μλ₯Ό νμνλ©°, μ€νμ μ΄μ©ν΄ "λ μμ£Ό λ±μ₯ν μ"λ₯Ό λΉ λ₯΄κ² μ°Ύλλ€.
- μ€νμ νμ©νμ¬ μκ° λ³΅μ‘λλ₯Ό O(N)μΌλ‘ μ΅μ ννλ€.
πΉ Java μ½λ ν΄μ€
import java.io.*;
import java.util.*;
public class Main {
static int N; // μμ΄μ κΈΈμ΄
static int[] numbers; // μ
λ ₯λ μμ΄
static int[] checkNum; // κ° μ«μμ λ±μ₯ νμλ₯Ό μ μ₯νλ λ°°μ΄
static int[] answer; // κ²°κ³Όλ₯Ό μ μ₯νλ λ°°μ΄
public static void main(String[] args) throws IOException {
input();
logic();
output();
}
// κ²°κ³Ό μΆλ ₯ λ©μλ
private static void output() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
sb.append(answer[i]).append(" ");
}
System.out.println(sb.toString().trim());
}
// μκ³ λ¦¬μ¦ μ€ν
private static void logic() {
Deque<Integer> stack = new ArrayDeque<>();
for (int i = N - 1; i >= 0; i--) { // μ€λ₯Έμͺ½μμ μΌμͺ½μΌλ‘ μν
while (!stack.isEmpty() && checkNum[numbers[i]] >= checkNum[stack.peek()]) {
stack.pop(); // νμ¬ μ«μλ³΄λ€ λ±μ₯ νμκ° μ μ μ«μλ€μ μ κ±°
}
if (stack.isEmpty()) {
answer[i] = -1; // λ μμ£Ό λ±μ₯ν μ«μκ° μμΌλ©΄ -1
} else {
answer[i] = stack.peek(); // κ°μ₯ κ°κΉμ΄ μ€λ±ν°μλ₯Ό μ μ₯
}
stack.push(numbers[i]); // νμ¬ μ«μλ₯Ό μ€νμ λ£μ
}
}
// μ
λ ₯ μ²λ¦¬
private static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine()); // μ«μμ κ°μ μ
λ ₯
StringTokenizer st = new StringTokenizer(br.readLine());
numbers = new int[N];
checkNum = new int[1000001]; // λ±μ₯ νμλ₯Ό μ μ₯νλ λ°°μ΄
answer = new int[N];
for (int i = 0; i < N; i++) {
numbers[i] = Integer.parseInt(st.nextToken());
checkNum[numbers[i]]++; // λ±μ₯ νμ μ¦κ°
}
}
}
π μ½λ μ€λͺ
π 1. μ λ ₯ μ²λ¦¬ (input())
- numbers[i] λ°°μ΄μ μμ΄μ μ μ₯ν©λλ€.
- checkNum λ°°μ΄μ μ΄μ©ν΄ κ° μ«μμ λ±μ₯ νμλ₯Ό μ μ₯ν©λλ€.
→ checkNum[μ«μ]++ ννλ‘ μΉ΄μ΄ν .
π 2. μ€λ±ν°μ μ°ΎκΈ° (logic())
π‘ μ€λ₯Έμͺ½μμ μΌμͺ½μΌλ‘ μννλ©΄μ μ€νμ νμ©ν©λλ€.
- stack.pop()μ ν΅ν΄ νμ¬ μ«μλ³΄λ€ λ±μ₯ νμκ° μμ μ«μλ€μ μ κ±°ν©λλ€.
- μ€νμ΄ λΉμλ€λ©΄ -1, μλλΌλ©΄ κ°μ₯ κ°κΉμ΄ μ€λ±ν°μλ₯Ό μ λ΅ λ°°μ΄μ μ μ₯ν©λλ€.
- νμ¬ μ«μλ₯Ό μ€νμ pushνμ¬ μ΄ν μ«μμ λΉκ΅ν©λλ€.
π μ€μν μ
- checkNum[numbers[i]] >= checkNum[stack.peek()]μ΄λ©΄ μ€νμ κ³μ λΉμ΄λ€.
- μ¦, νμ¬ μ«μμ λ±μ₯ νμκ° λ λ§λ€λ©΄ κΈ°μ‘΄ μ€νμ μ«μλ νμ μμ!
π 3. μΆλ ₯ μ²λ¦¬ (output())
- StringBuilderλ₯Ό νμ©ν΄ κ²°κ³Όλ₯Ό μΆλ ₯ν©λλ€.
→ μ±λ₯ μ΅μ νλ₯Ό μν΄ System.out.println() λμ StringBuilder μ¬μ©.
π₯ μκ° λ³΅μ‘λ λΆμ
μ°μ° μ΅μ μ κ²½μ° μν νμ μκ° λ³΅μ‘λcheckNum λ°°μ΄ μ΄κΈ°ν | N | O(N) |
logic()μμμ λ°λ³΅ | N | O(N) |
stackμ push/pop | N | O(N) |
μ΄ν© | O(N) |
π κ²°λ‘
π λͺ¨λ μ°μ°μ΄ O(N) μ΄λ΄λ‘ μνλλ―λ‘ ν¨μ¨μ μ
λλ€.
π μ 리
β ν΅μ¬ ν¬μΈνΈ
- λ±μ₯ νμ λ°°μ΄ (checkNum)μ 미리 κ³μ°νλ€.
- μ€λ₯Έμͺ½μμ μΌμͺ½μΌλ‘ νμνλ©΄μ, μ€νμ νμ©νμ¬ λ±μ₯ νμκ° λ λ§μ μλ₯Ό μ°Ύλλ€.
- μ€νμ μ΄μ©ν΄ λΆνμν λΉκ΅λ₯Ό μ€μ¬μ μκ° λ³΅μ‘λλ₯Ό O(N)μΌλ‘ μ΅μ ννλ€.
π― μ΄ μκ³ λ¦¬μ¦μ μ₯μ
β κΈ°μ‘΄ μ€ν°μ λ¬Έμ λ₯Ό νμ₯ν νν
β μ€νμ νμ©ν΄ O(N)μΌλ‘ μ΅μ ν
β λ©λͺ¨λ¦¬ μ¬μ©λμ΄ μ κ³ λΉ λ₯΄λ€.
μ΄μ μ΄ λ°©λ²μ μ μ©νλ©΄ μ€λ±ν°μλ₯Ό λΉ λ₯΄κ² μ°Ύμ μ μμ΅λλ€!
π‘ μ€νμ νμ©ν μκ³ λ¦¬μ¦μ μ΅νλλ©΄, λ€λ₯Έ λ¬Έμ μμλ ν° λμμ΄ λ κ²μ
λλ€. π
μ΄ κΈμ΄ λμμ΄ λμλ€λ©΄, μ’μμμ 곡μ λΆνλ립λλ€! π
'Algorithm & Data Structures > BOJ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
b3015. μ€μμμ€ μ¬κ²°ν© (0) | 2025.02.25 |
---|---|
b.1725 νμ€ν κ·Έλ¨ (0) | 2025.02.06 |
b24497. μκ³ λ¦¬μ¦ μμ - κΉμ΄ μ°μ νμ 1 (0) | 2025.01.27 |
b.17298 μ€ν°μ (1) | 2025.01.23 |
b.2293 λμ 1 (0) | 2025.01.21 |