[백준] 13116번 30번 (C++)

2025. 9. 10. 19:00·Algorithm
728x90

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

 

 

이 문제는 트리가 주어지며 각각의 노드에 대해서 가장 가까운 부모를 찾아 10을 곱한값을 출력하는 문제이다.

 

따라서 이 문제는 LCA(최소공통조상)을 찾는 문제라고 볼 수 있다.

 

이 문제를 해결하기 위해서는 dfs를 사용하여 루트에서부터 각각의 노드의 부모, 깊이를 기록하여 

두 노드의 깊이를 맞춰준후 부모를 호출하여 같은 부모일 경우 최소 공통 조상이기 때문에

그 값을 10을 곱하여 출력하면 되면 해결할 수 있다.

 

 

정답코드

#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;
    int y;
    int r;
};

int dx[] = {0, -1, 0, 1, 1, -1, -1, 1};
int dy[] = {-1, 0, 1, 0, -1, 1, -1, 1};
int T;
int parent[1026];
int depth[1026];

void dfs(int Node, int par, int dep) {
    if(Node >= 1024) return;
    parent[Node] = par;
    depth[Node] = dep;

    dfs(Node * 2, Node, dep+1);
    dfs(Node * 2 + 1, Node, dep+1);
}

void solve() {
    dfs(1, 0, 0);

    for(int i = 0; i < T; i++) {
        int a, b;
        cin >> a >> b;

        int deepa = depth[a];
        int deepb = depth[b];

        while(deepa > deepb) {
            a = parent[a];
            deepa--;
        }

        while(deepa < deepb) {
            b = parent[b];
            deepb--;
        }

        while(a != b) {
            a = parent[a];
            b = parent[b];
        }

        cout << a * 10<< endl;
    }
}

void input() {
    cin >> T;
}

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

    input();
    solve();
}

 

가장 핵심인 dfs함수를 살펴보면

void dfs(int Node, int par, int dep) {
    if(Node >= 1024) return;
    parent[Node] = par;
    depth[Node] = dep;

    dfs(Node * 2, Node, dep+1);
    dfs(Node * 2 + 1, Node, dep+1);
}

 

현재 노드에서 부모노드를 기록하고 왼쪽 노드와 오른쪽 노드를 다시 호출하여 탐색한다.

이때 수의 범위가 1024 까지기 때문에 1024를 넘기는 경우 return하여 함수를 종료한다.

 

void solve() {
    dfs(1, 0, 0);

    for(int i = 0; i < T; i++) {
        int a, b;
        cin >> a >> b;

        int deepa = depth[a];
        int deepb = depth[b];

        while(deepa > deepb) {
            a = parent[a];
            deepa--;
        }

        while(deepa < deepb) {
            b = parent[b];
            deepb--;
        }

        while(a != b) {
            a = parent[a];
            b = parent[b];
        }

        cout << a * 10<< endl;
    }

 

solve함수 에서는 각각의 기록된 값들에 대해서

깊이를 맞춰준다. 이때 깊이가 다른 경우 더 낮은 깊이로 맞춰 준후 부모를 호출하여 같아질때 10을 곱하여 출력하면 된다.

 

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

'Algorithm' 카테고리의 다른 글

[백준] 18223번 민준이와 마산 그리고 건우 (C++)  (0) 2025.09.12
[백준] 1812번 사탕 (C++)  (0) 2025.09.11
[백준] 12014번 주식 (C++)  (0) 2025.09.09
[백준] 23305번 수강변경 (C++)  (0) 2025.09.08
[백준] 16472번 고냥이 (C++)  (0) 2025.09.07
'Algorithm' 카테고리의 다른 글
  • [백준] 18223번 민준이와 마산 그리고 건우 (C++)
  • [백준] 1812번 사탕 (C++)
  • [백준] 12014번 주식 (C++)
  • [백준] 23305번 수강변경 (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (284) N
      • Programming (51) N
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (7) 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)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바