Algorithm & Data Structures/BOJ

b13913. μˆœκ°„μ΄λ™ 4

Geisha 2025. 4. 22. 21:14

 

 

πŸ“Œ μžλ°”(Java)둜 ν‘ΈλŠ” μˆ¨λ°”κΌ­μ§ˆ 4 - λ°±μ€€ 13913🧍‍β™‚οΈβž‘οΈπŸ§‍♀️

 

μ΅œμ†Œ μ‹œκ°„ + 이동 κ²½λ‘œκΉŒμ§€ 좜λ ₯ν•˜λŠ” BFS 문제!

 

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

 

λ°±μ€€ 13913번 - μˆ¨λ°”κΌ­μ§ˆ 4λŠ”

μ •μˆ˜ N(수빈이 μœ„μΉ˜)μ—μ„œ K(동생 μœ„μΉ˜)κΉŒμ§€

λ‹€μŒ μ„Έ κ°€μ§€ μ—°μ‚°μœΌλ‘œ 이동해 μ΅œμ†Œ μ‹œκ°„μ„ κ΅¬ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

 

  • X - 1
  • X + 1
  • X * 2

 

뿐만 μ•„λ‹ˆλΌ,

βœ” μ΅œλ‹¨ μ‹œκ°„κ³Ό ν•¨κ»˜

βœ” κ·Έλ•Œμ˜ 이동 경둜λ₯Ό μ •ν™•νžˆ 좜λ ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€!

 


πŸ’‘ 예제 μž…λ ₯

5 17

 

πŸ’‘ 예제 좜λ ₯

4
5 10 9 18 17

 

 


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

 

이 λ¬Έμ œλŠ” μ „ν˜•μ μΈ μ΅œλ‹¨ 거리 탐색 → BFS λ¬Έμ œμž…λ‹ˆλ‹€.

ν•˜μ§€λ§Œ 경둜 μΆ”μ κΉŒμ§€ ν•΄μ•Ό ν•˜λ―€λ‘œ,

βœ” 이동 이전 μœ„μΉ˜λ₯Ό κΈ°λ‘ν•˜λŠ” prev[] 배열을 ν™œμš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 


πŸ”Ή Java μ½”λ“œ μ„€λͺ…

πŸ“Œ Node 클래슀

static class Node {
    int position;
    int time;
    ...
}

βœ” ν˜„μž¬ μœ„μΉ˜μ™€ κ±Έλ¦° μ‹œκ°„μ„ ν•¨κ»˜ μ €μž₯ν•˜λŠ” 클래슀

 

 

πŸ“Œ BFS 둜직

static int bfs() {
    Queue<Node> queue = new ArrayDeque<>();
    queue.offer(new Node(start, 0));
    visited[start] = true;

    while (!queue.isEmpty()) {
        Node current = queue.poll();

        if (current.position == end) {
            return current.time;
        }

        for (int next : new int[]{current.position - 1, current.position + 1, current.position * 2}) {
            if (next >= 0 && next < MAX && !visited[next]) {
                visited[next] = true;
                prev[next] = current.position;
                queue.offer(new Node(next, current.time + 1));
            }
        }
    }
    return -1;
}

βœ” visited[]둜 쀑볡 λ°©λ¬Έ λ°©μ§€

βœ” prev[next] = current.position둜 경둜 μ €μž₯

βœ” λ„μ°©ν•˜λ©΄ current.time을 λ°˜ν™˜

 

 

πŸ“Œ 경둜 좜λ ₯ 둜직

static void printPath() {
    Deque<Integer> path = new ArrayDeque<>();
    for (int at = end; at != -1; at = prev[at]) {
        path.push(at);
    }

    StringBuilder sb = new StringBuilder();
    while (!path.isEmpty()) {
        sb.append(path.pop()).append(" ");
    }
    System.out.println(sb.toString().trim());
}

βœ” prev[]λ₯Ό 거슬러 μ˜¬λΌκ°€λ©° stack에 μ €μž₯

βœ” stack을 μ‚¬μš©ν•΄ μˆœμ„œλŒ€λ‘œ 좜λ ₯

 


πŸ† 정리

βœ… 핡심 포인트

 

  • BFSλŠ” μ΅œλ‹¨ 거리 탐색에 적합
  • 경둜 볡원은 prev[] 배열을 톡해
  • O(N) μ‹œκ°„ μ•ˆμ— μ •λ‹΅ 경둜 좔적 κ°€λŠ₯