133. Clone Graph

2024. 10. 11. 17:12·Algorithm/LeetCode

문제

원본 노드를 깊은 복사하는 문제이다. bfs를 사용했다.

링크: https://leetcode.com/problems/clone-graph/

Solution

/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> neighbors;
    public Node() {
        val = 0;
        neighbors = new ArrayList<Node>();
    }
    public Node(int _val) {
        val = _val;
        neighbors = new ArrayList<Node>();
    }
    public Node(int _val, ArrayList<Node> _neighbors) {
        val = _val;
        neighbors = _neighbors;
    }
}
*/

class Solution {
    public Node cloneGraph(Node node) {
        // 방문 유무 확인 및 복제 노드를 조회하는 용도
        // 값에는 복제 노드를 저장한다.
        Map<Integer, Node> visited = new HashMap<>();
        // 큐에 시작 노드를 추가
        Queue<Node> queue = new LinkedList<>();
        if(node == null) return null;
        queue.offer(node);
        // 시작 노드 방문 체크
        Node copied = new Node(node.val);
        visited.put(node.val, copied);

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

            for(Node originNeighbor : polledOriginNode.neighbors) {
                if(!visited.containsKey(originNeighbor.val)) {
                    // 방문하지 않는 노드는 복제해서 방문 체크한다.
                    Node copiedNeighbor = new Node(originNeighbor.val);
                    visited.put(originNeighbor.val, copiedNeighbor);
                    queue.offer(originNeighbor);
                }

                // 최상위 노드의 복제 노드
                Node copiedNode = visited.get(polledOriginNode.val);
                // 이웃 노드의 복제 노드
                Node copiedNeighbor = visited.get(originNeighbor.val);

                copiedNode.neighbors.add(copiedNeighbor);
            }
        }
        return copied;
    }
}

일반적인 BFS 구현에서는 방문 배열을 단순히 방문 여부 확인 용도로 사용하지만, 이 문제에서는 방문 여부 확인 외에도 방문한 노드의 복제 노드를 저장하고 조회하는 용도로 활용된다.

깊은 복사를 위해서 복제 노드는 한번 씩만 사용되어야 한다. BFS 구현에서 큐는 각 요소가 중복되지 않음을 보장한다. 따라서, 최상위 노드를 꺼낼 때마다 해당 노드의 복제 노드를 처리한다.

'Algorithm > LeetCode' 카테고리의 다른 글

452. Minimum Number of Arrows to Burst Balloons  (0) 2024.10.16
417. Pacific Atlantic Water Flow  (0) 2024.10.14
207. Course Schedule  (0) 2024.10.13
11. Container With Most Water  (0) 2024.10.10
15. 3Sum  (0) 2024.10.05
'Algorithm/LeetCode' 카테고리의 다른 글
  • 417. Pacific Atlantic Water Flow
  • 207. Course Schedule
  • 11. Container With Most Water
  • 15. 3Sum
사랑우주인
사랑우주인
  • 사랑우주인
    lovelyAlien
    사랑우주인
  • 전체
    오늘
    어제
  • 글쓰기
    관리
    • 분류 전체보기 (209)
      • Programming (4)
        • Spring (28)
        • Java (46)
        • JPA (2)
        • 디자인 패턴 (5)
        • 개발&아키텍처 (0)
      • Network (14)
      • OS (19)
      • Database (1)
      • Kubernetes (0)
      • Kafka (2)
      • Algorithm (49)
        • BaekJoon (1)
        • Programmers (19)
        • Algorithm (5)
        • Socar (2)
        • LeetCode (19)
      • Interview (2)
      • Issues (2)
      • DotJoin (1)
      • Git (4)
      • 독서 (3)
      • 끄적끄적 (1)
      • 외부활동 (26)
        • 항해플러스 (2)
        • JSCODE 네트워크 (19)
        • JSCODE 자바 (5)
      • SQL (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • GitHub
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    minimum number of arrows to burst balloons
    준영속 엔티티
    추상화 클래스
    Generic
    Reorder List
    algorithm
    rotting oranges
    runner 기법
    운영체제
    트랜잭션
    RR
    디자인 패턴
    LinkedList
    AuthenticationSuccessHandler
    pacific atlantic water flow
    @JsonNaming
    Climbing Stairs
    Process
    clone graph
    JSCode
    @JsonProperty
    wildcards
    socar
    OS
    Oauth2
    BFS
    fcfs
    lower bounded wildcards
    제네릭
    Thread
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.1
사랑우주인
133. Clone Graph
상단으로

티스토리툴바