Algorithm & Data Structures/BOJ

b3665. μ΅œμ’…μˆœμœ„

Geisha 2025. 4. 9. 16:46

 

https://www.acmicpc.net/problem/3665

 

 

 

πŸ“Œ μžλ°”(Java)둜 ν‘ΈλŠ” μ΅œμ’… μˆœμœ„ 문제 - λ°±μ€€ 3665 πŸ†πŸ”

 

πŸ”Ž 문제 κ°œμš”

 

λ°±μ€€ 3665번 - μ΅œμ’… μˆœμœ„λŠ” μœ„μƒ μ •λ ¬(Topological Sort)을 μ‘μš©ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

 

  • μž‘λ…„ μˆœμœ„κ°€ μ£Όμ–΄μ§€κ³ ,
  • μ˜¬ν•΄ 바뀐 μˆœμœ„ 정보듀이 μž…λ ₯되며,
  • κ·Έ 정보λ₯Ό λ°”νƒ•μœΌλ‘œ μ˜¬ν•΄μ˜ μ΅œμ’… μˆœμœ„λ₯Ό κ²°μ •ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

 

단,

 

  • μˆœμœ„λ₯Ό μ •ν™•νžˆ ν•˜λ‚˜λ‘œ μ •ν•  수 μ—†λ‹€λ©΄ ? 좜λ ₯
  • λͺ¨μˆœμ΄ λ°œμƒν•΄μ„œ μˆœμœ„λ₯Ό μ •ν•  수 μ—†λ‹€λ©΄ IMPOSSIBLE 좜λ ₯

 


πŸ’‘ 예제 μž…λ ₯

1
5
5 4 3 2 1
2
2 4
3 1

 

πŸ’‘ 예제 좜λ ₯

5 3 2 4 1

 

 


πŸ›  μ•Œκ³ λ¦¬μ¦˜ μ ‘κ·Ό 방식

 

이 λ¬Έμ œλŠ” κΈ°λ³Έ μœ„μƒ 정렬에

βœ” μˆœμœ„κ°€ 바뀐 간선을 λ’€μ§‘λŠ” μž‘μ—…(reverse edge)

βœ” 정점 μ§„μž… 차수(indegree) μ—…λ°μ΄νŠΈ

βœ” μœ„μƒ μ •λ ¬ κ²°κ³Όκ°€ μ—¬λŸ¬ κ°œμΈμ§€ λ˜λŠ” 사이클이 μžˆλŠ”μ§€ νŒλ‹¨

이 ν¬ν•¨λœ λ¬Έμ œμž…λ‹ˆλ‹€.

 


πŸ”Ή Java μ½”λ“œ 핡심 흐름

 

 

1. μž‘λ…„ μˆœμœ„λ₯Ό 기반으둜 κΈ°λ³Έ κ·Έλž˜ν”„ 생성

for (int i = 0; i < N; i++) {
    for (int j = i + 1; j < N; j++) {
        graph[arr[i]].add(arr[j]);  // μ•žμˆœμœ„ → λ’·μˆœμœ„
    }
}

βœ” μˆœμœ„ λ¦¬μŠ€νŠΈκ°€ μ•žμ— μžˆμ„μˆ˜λ‘ 더 높은 μˆœμœ„μ΄λ―€λ‘œ

βœ” 인접 리슀트λ₯Ό κΈ°μ€€μœΌλ‘œ κ°„μ„  μΆ”κ°€

 

 

2. λ°”뀐 μˆœμœ„ 정보 반영 (κ°„μ„  λ’€μ§‘κΈ°)

if (graph[a].contains(b)) {
    graph[a].remove((Integer) b);
    graph[b].add(a);
} else {
    graph[b].remove((Integer) a);
    graph[a].add(b);
}

βœ” abμ˜€λ˜ 간선을 ba둜 λ³€κ²½

βœ” λ°˜λŒ€μ˜ κ²½μš°λ„ λ§ˆμ°¬κ°€μ§€

βœ” μˆœμœ„ λ³€κ²½ 정보λ₯Ό λ°˜μ˜ν•΄μ„œ κ·Έλž˜ν”„λ₯Ό μˆ˜μ •

 

 

3. μœ„상 μ •λ ¬ μˆ˜ν–‰ + κ²°κ³Ό 해석

PriorityQueue<Integer> pq = new PriorityQueue<>();
for (int j = 1; j <= N; j++) {
    if (indegree[j] == 0) {
        pq.offer(j);
    }
}

while (!pq.isEmpty()) {
    if (pq.size() > 1) uncertain = true;  // κ°€λŠ₯ν•œ μˆœμœ„κ°€ μ—¬λŸ¬ 개
    int curr = pq.poll();
    result.add(curr);

    for (int next : graph[curr]) {
        indegree[next]--;
        if (indegree[next] == 0) pq.offer(next);
    }
}

βœ” μ§„μž… 차수(indegree)κ°€ 0인 정점을 큐에 λ„£κ³  μˆœμ„œλŒ€λ‘œ λ°©λ¬Έ

βœ” 정닡이 μœ μΌν•˜μ§€ μ•ŠμœΌλ©΄ ?,

βœ” 사이클이 μ‘΄μž¬ν•˜λ©΄ λ°©λ¬Έ μˆ˜κ°€ N이 μ•„λ‹˜ → IMPOSSIBLE

 


πŸ” 좜λ ₯ 쑰건

if (result.size() != N) {
    System.out.println("IMPOSSIBLE");
} else if (uncertain) {
    System.out.println("?");
} else {
    for (int x : result) sb.append(x).append(" ");
    System.out.println(sb);
}

βœ” μœ„μƒ 정렬이 정상 μ’…λ£Œλ˜μ—ˆλŠ”μ§€

βœ” 쀑간에 큐에 μ—¬λŸ¬ λ…Έλ“œκ°€ λ“€μ–΄κ°„ 적이 μžˆλŠ”μ§€

βœ” 이 쑰건듀을 톡해 상황에 λ§žλŠ” μ •λ‹΅ 좜λ ₯

 


πŸ† 정리

 

 

βœ… 핡심 포인트

 

  • μœ„μƒ 정렬을 기반으둜 κ°„μ„  λ’€μ§‘κΈ°(μˆœμœ„ μˆ˜μ •) 적용
  • κ²°κ³Όκ°€ ν•œ κ°€μ§€κ°€ μ•„λ‹Œ 경우 ? 처리
  • μ‚¬μ΄ν΄λ‘œ 인해 정렬이 λΆˆκ°€λŠ₯ν•˜λ©΄ IMPOSSIBLE 처리

 

 

이 글이 도움이 λ˜μ…¨λ‹€λ©΄ μ’‹μ•„μš”μ™€ 곡유 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€! 😊