e.den
eden.dev.log
e.den
전체 방문자
오늘
어제
  • 분류 전체보기 (57)
    • 슬기로운 취준 생활 (1)
    • Study (30)
      • Swift (7)
      • iOS (6)
      • Java (2)
      • Spring (6)
      • Algorithm (9)
    • Coding Test (8)
      • Swea (0)
      • Baekjoon (8)
      • Programmers (0)
    • 삽질기 (3)
    • 독서록 (15)
      • Clean Architecture (5)
      • Clean Code (10)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • cleancode
  • 클린아키텍처
  • 부스트코스
  • Spring
  • 고차함수
  • initializer
  • CoreAnimation
  • java
  • 자료구조
  • CGLayer
  • lifecycle
  • MySQL
  • lombok
  • Filter
  • property
  • compactMap
  • flatmap
  • swift
  • RunLoop
  • CleanArchitecture
  • 프로퍼티
  • 클린코드
  • Algorithm
  • reduce
  • UITextView
  • 알고리즘
  • ios
  • Map
  • 정렬
  • mybatis

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
e.den

eden.dev.log

[BOJ] 백준 11725 트리의 부모 찾기
Coding Test/Baekjoon

[BOJ] 백준 11725 트리의 부모 찾기

2021. 3. 21. 20:55

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

 

11725번: 트리의 부모 찾기

루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.

www.acmicpc.net

 


 

풀이 방법

  1. 방향에 대한 조건은 없으므로, 양방향 인접 리스트를 만든다.
  2. bfs를 돌리는데 루트인 1번 정점부터 큐에 넣고, 부모를 표시할 배열(parents)을 하나 만든다. 1번 정점은 루트 노드이기 때문에 방문했다는 의미로 만들어둔 배열 1번 인덱스 값을 1로 설정한다.
  3. 큐에 들어있는 요소를 꺼내서 그 요소와 연결되어 있는 노드를 찾고 그 정점에 방문하지 않았다면 큐에 넣는다.
  4. parents 배열의 인덱스와 찾은 노드의 번호가 같을 경우 큐에서 꺼낸 요소 즉, 부모 노드를 값으로 집어넣는다.

 

문제에 있는 예제 1번으로 설명을 하자면,

루트 노드인 1번 정점과 연결된 6번 4번 노드를 큐에 넣고 배열에 부모 노드 표시를 하고 나서 큐에서 6을 꺼낸 상태
6번과 연결된 1번은 이미 방문이 된 상태고, 3번은 방문되지 않은 상태이니 배열 3번에 부모 노드인 6이라는 값을 넣고 3번을 큐에 넣는다
큐에서 4번을 꺼내서 4번과 연결된 1,2,7번 노드를 봤을 때, 배열에 값이 없는 2번, 7번에 4라는 값을 넣고 2, 7번 정점을 큐에 넣는다.
큐에서 3번을 꺼내서 3번과 연결된 6, 5번 정점을 봤을 때, 배열에 값이 없는 5번에 3이라는 값을 넣고 5번 정점을 큐에 넣는다
모든 정점에 대한 방문이 끝났으므로, 큐가 비는 순간 bfs가 멈추게 된다

 

다음은 Java로 작성한 코드이다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class B11725 {
    private static final ArrayList<ArrayList<Integer>> list = new ArrayList<>();
    private static int [] parents;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int n = Integer.parseInt(br.readLine());
        
        parents = new int[n+1];

        for (int i = 0; i <= n+1; i++) {
            list.add(new ArrayList<>());
        }

        for (int i = 1; i < n; i++) {
            st = new StringTokenizer(br.readLine());

            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());

            list.get(a).add(b);
            list.get(b).add(a);
        }

        bfs();

        for (int i = 2; i < parents.length; i++) {
            System.out.println(parents[i]);
        }
    }

    private static void bfs() {
        LinkedList<Integer> q = new LinkedList<>();
        q.offer(1);
        parents[1] = 1;

        while (!q.isEmpty()) {
            int p = q.poll();

            for (int item: list.get(p)) {
                if (parents[item] == 0) {
                    parents[item] = p;
                    q.offer(item);
                }
            }
        }
    }
}
저작자표시 (새창열림)

'Coding Test > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 5567 결혼식  (0) 2021.03.22
[BOJ] 백준 1697 숨바꼭질  (0) 2021.03.22
[BOJ] 백준 2343 기타 레슨  (1) 2021.03.15
[BOJ] 백준 7569 토마토  (2) 2021.03.15
[BOJ] 백준 2644 촌수계산  (2) 2021.03.09
    'Coding Test/Baekjoon' 카테고리의 다른 글
    • [BOJ] 백준 5567 결혼식
    • [BOJ] 백준 1697 숨바꼭질
    • [BOJ] 백준 2343 기타 레슨
    • [BOJ] 백준 7569 토마토
    e.den
    e.den
    문제를 본질적으로 접근하자

    티스토리툴바