[BOJ] 백준 15681. 트리와 쿼리

2024. 5. 4. 14:31· Java/BOJ

문제

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

 

 

 

 

 


풀이

 서브 트리에 속한 정점의 개수를 세는 문제입니다.

 

dfs를 통해 그래프를 탐색하며, 서브 트리의 루트가 인덱스인 배열에 정점의 개수를 저장합니다.

 

 처음에 문제를 풀이할 때, 루트가 아닌 제일 마지막 자식부터 dfs 탐색을 시작해보려고도 했지만, 그렇게 접근하면 마지막 자식도 체크해야하고, 방문 배열을 통해 접근을 막아주어야하고.. 여러모로 로직이 복잡해집니다.

 

 그래서 루트부터 출발해 자식으로 뻗어가며 subtrees 배열에 정점의 개수를 저장합니다. 이때 부모 노드에 자식 노드가 가진 정점의 개수를 더해주면 됩니다. 주의할 것은, 부모에서 자식으로 내려갔는데 다시 부모 노드를 검사하지 않도록 하는 것입니다. 이것은 dfs에 parent라는 매개 변수를 전달함으로써 조건을 걸어주었습니다.

 

 아래는 소스 코드입니다.


소스 코드

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {

    static int N,R,Q;
    static ArrayList<Integer>[] list;
    static int[] subtrees;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        R = sc.nextInt();
        Q = sc.nextInt();

        list = new ArrayList[N+1];
        for(int i = 1;i<N+1;i++){
            list[i] = new ArrayList<>();
        }
        subtrees = new int[N+1];
        Arrays.fill(subtrees,1);

        for(int i = 0; i<N-1;i++){
            int st = sc.nextInt();
            int ed = sc.nextInt();
            list[st].add(ed);
            list[ed].add(st);
        }

        dfs(R,-1);

        for(int i = 0;i<Q;i++){
            int query = sc.nextInt();
            System.out.println(subtrees[query]);
        }
    }
    
    static void dfs(int now, int parent){
        for(int next:list[now]){
            if(parent!=next){
                dfs(next, now);
            }
        }
        if(parent!=-1) subtrees[parent]+=subtrees[now];
    }
}

'Java > BOJ' 카테고리의 다른 글

[BOJ] 백준 1063. 킹  (0) 2024.05.07
[BOJ] 백준 18223. 민준이와 마산 그리고 건우  (0) 2024.05.06
[BOJ] 백준 21610. 마법사 상어와 비바라기  (0) 2024.04.29
[BOJ] 백준 1240. 노드사이의 거리  (0) 2024.04.26
[BOJ] 백준 5568. 카드놓기  (0) 2024.04.21
'Java/BOJ' 카테고리의 다른 글
  • [BOJ] 백준 1063. 킹
  • [BOJ] 백준 18223. 민준이와 마산 그리고 건우
  • [BOJ] 백준 21610. 마법사 상어와 비바라기
  • [BOJ] 백준 1240. 노드사이의 거리
동구름이
동구름이
동구름이
동구름
동구름이
전체
오늘
어제
  • 분류 전체보기 (177)
    • Java (63)
      • Java 를 파헤쳐보자 (13)
      • BOJ (45)
      • 프로그래머스 (3)
      • SWEA (1)
      • Java GUI (1)
    • JavaScript (17)
      • JS를 파헤쳐보자 (7)
      • 프로그래머스 (7)
      • JS 학습 정리 (1)
    • Backend (32)
      • Spring (3)
      • HTTP (7)
      • 프로젝트 (10)
      • MySQL (5)
      • Redis (3)
      • Elastic Search (1)
      • 인증, 인가 (3)
    • CS (57)
      • 운영체제 (35)
      • Network (22)
    • Git (2)
    • 개발 관련 이것저것 (2)
    • etc (1)
    • 독서 (0)
    • 사설 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 이석복
  • 운영체제
  • 모든 개발자를 위한 HTTP 웹 기본 지식
  • Java
  • 김영한
  • 레디스
  • OS
  • 프로그래머스
  • 한양대
  • 네트워크
  • BOJ
  • JCF
  • 자바
  • 스택
  • 구현
  • 큐
  • 반효경
  • 자바스크립트
  • 백준
  • 인프런

최근 글

hELLO · Designed By 정상우.v4.2.2
동구름이
[BOJ] 백준 15681. 트리와 쿼리
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.