[백준] 1068번 트리 (C++)

2025. 8. 26. 19:38·Algorithm
728x90

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

 

 

이 문제는 트리가 주어졌을때 어느 한 부분을 제거하고 난 후 트리에서 리프노드의 개수를 구하는 문제이다.

 

여기서 알아야 할 점은 리프노드는 자기 자식을 가지지 않는 노드이다.

 

트리 구조이기때문에 dfs를 사용하여 풀어야겠다고 생각을 하였다.

 

 

처음엔 트리가 무조건 이진트리로 들어온다고 생각을 하여 간선이 하나인 경우는 리프 노드라고 생각하여 구현을 했는데

계속 틀렸어서 질문게시판을 확인해보니 무조건 이진트리로 들어오는 것이 아닌 위 그림처럼 들어올 수도 있다고 나와서

다른 방법으로 접근을 하였다.

 

dfs로 호출을 할때 지울 노드 번호를 만났을때 바로 continue를 걸어주어 재귀호출을 못하게 하였으며

함수 내에서 children 변수를 두어 자식이 몇개인지 세주었으며

 

만약 변수가 0인경우 재귀호출을 하지 않았고 이는 리프노드이기 때문에 개수를 늘려주었다.

 

정답코드

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
#define endl "\n"
#define MAX 1e9

struct coordinate {
    int x;
    string s;
    vector<int> v;
};

int dx[] = {0, -1, 0, 1, 1, -1, -1, 1};
int dy[] = {-1, 0, 1, 0, -1, 1, -1, 1};
int N, M;
vector<vector<int>> v(51);
bool visited[51];
int start;
int cnt;

void dfs(int Node, int parent) {
    visited[Node] = true;
    int children = 0;

    for(auto it : v[Node]) {
        if(it == M || it == parent) continue;
        children++;
        dfs(it, Node);
    }
    if(children == 0) cnt++;
}

void solve() {
    if(start != M) {
        dfs(start, -1);
    }

    cout << cnt;
}

void input() {
    cin >> N;

    for(int i = 0; i < N; i++) {
        int a;
        cin >> a;

        if(a != -1) {
            v[i].push_back(a);
            v[a].push_back(i);
        }
        else start = i;
    }

    cin >> M;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    input();
    solve();
}

 

728x90
저작자표시 (새창열림)

'Algorithm' 카테고리의 다른 글

[백준] 14620번 꽃길 (C++)  (0) 2025.08.28
[백준] 25381번 ABBC (C++)  (0) 2025.08.27
[백준] 2234번 성곽 (C++)  (0) 2025.08.25
[백준] 최소공통조상 LCA 11437번 (C++)  (0) 2025.08.24
[백준] 20364번 부동산 다툼 (C++)  (0) 2025.08.23
'Algorithm' 카테고리의 다른 글
  • [백준] 14620번 꽃길 (C++)
  • [백준] 25381번 ABBC (C++)
  • [백준] 2234번 성곽 (C++)
  • [백준] 최소공통조상 LCA 11437번 (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (285) N
      • Programming (52) N
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (8) N
        • Android (2)
        • CI,CD (1)
      • Algorithm (173)
        • Review (4)
      • Security (14)
        • WebHacking (3)
        • Websecurity (11)
      • OS (19)
        • Linux (12)
        • Mac os (2)
      • 머신러닝 (1)
      • CS(Computer Science) (12)
        • 컴퓨터 네트워크 (3)
        • 컴퓨터 구조 (1)
        • 인공지능 (8)
      • Docker (2) N
      • Dev Book Review (3)
        • Clean Code (1)
        • Effective Java (0)
        • Real MySQL (2)
      • SWM (1)
      • Review (6)
      • AWS (2)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    그래프 이론
    Bandit
    백준
    linux
    이분탐색
    우선순위 큐
    투포인터
    깊이우선탐색
    다익스트라
    코딩
    DFS
    BFS
    DP
    그리디
    누적합
    Leviathan
    정렬
    트리
    재귀
    시뮬레이션
    wargame
    구현
    비트마스킹
    다이나믹 프로그래밍
    우선순위큐
    c언어
    브루트포스
    WebSecurity
    에라토스테네스의 체
    백트래킹
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 1068번 트리 (C++)
상단으로

티스토리툴바