자료구조 공부/Tree 구조 알고리즘 6

[백준] 15681 트리와 쿼리 <Java> - 트리에서 DP

문제 간선에 가중치와 방향성이 없는 임의의 루트 있는 트리가 주어졌을 때, 아래의 쿼리에 답해보도록 하자. 정점 U를 루트로 하는 서브트리에 속한 정점의 수를 출력한다. 만약 이 문제를 해결하는 데에 어려움이 있다면, 하단의 힌트에 첨부한 문서를 참고하자. 풀이 풀이는 문제에서 설명하는대로 구현을 하였다 코드를 보면서 설명을 하면, public static void makeTree(int currentNode, int parentNode) { for(int node : tree[currentNode]) { if(node != parentNode) { child[currentNode].add(node); parent[node] = currentNode; makeTree(node, currentNode); ..

[백준] 2263 트리의 순회(분할정복)

문제 n개의 정점을 갖는 이진 트리의 정점에 1부터 n까지의 번호가 중복 없이 매겨져 있다. 이와 같은 이진 트리의 인오더와 포스트오더가 주어졌을 때, 프리오더를 구하는 프로그램을 작성하시오. 풀이 다음과 같은 이진그래프가 있다고 가정하고 문제를 풀어보면 노랑 - 부모 빨강 - 왼쪽 자식 트리 파랑 - 오른쪽 자식 트리 으로 하고 설명을 하면, 우선 초기의 형태는 위의 그림과 같다. 여기서 Pre-Order 는 왼쪽 자식부터 방문하기 때문에, 왼쪽부터 방문을 하게되면 한가지 규칙이 있다는 것을 알 수 있다. 부모는 Post-Order의 가장 뒤라는 점이다. 또 여기서 다음 왼쪽 자식으로 가게 된다면, 이제 또 다른 2가지 규칙을 찾을 수 있을 것이다. In-Order의 부모 노드 위치에서 In-Order..

[프로그래머스] 길 찾기 게임

문제 전무로 승진한 라이언은 기분이 너무 좋아 프렌즈를 이끌고 특별 휴가를 가기로 했다. 내친김에 여행 계획까지 구상하던 라이언은 재미있는 게임을 생각해냈고 역시 전무로 승진할만한 인재라고 스스로에게 감탄했다. 라이언이 구상한(그리고 아마도 라이언만 즐거울만한) 게임은, 카카오 프렌즈를 두 팀으로 나누고, 각 팀이 같은 곳을 다른 순서로 방문하도록 해서 먼저 순회를 마친 팀이 승리하는 것이다. 그냥 지도를 주고 게임을 시작하면 재미가 덜해지므로, 라이언은 방문할 곳의 2차원 좌표 값을 구하고 각 장소를 이진트리의 노드가 되도록 구성한 후, 순회 방법을 힌트로 주어 각 팀이 스스로 경로를 찾도록 할 계획이다. 라이언은 아래와 같은 특별한 규칙으로 트리 노드들을 구성한다. 트리를 구성하는 모든 노드의 x, ..

백준 3176 (도로 네트워크) - LCA 풀이(Sparse Table 사용)

문제 N개의 도시와 그 도시를 연결하는 N-1개의 도로로 이루어진 도로 네트워크가 있다. 모든 도시의 쌍에는 그 도시를 연결하는 유일한 경로가 있고, 각 도로의 길이는 입력으로 주어진다. 총 K개의 도시 쌍이 주어진다. 이때, 두 도시를 연결하는 경로 상에서 가장 짧은 도로의 길이와 가장 긴 도로의 길이를 구하는 프로그램을 작성하시오. 풀이 LCA 문제에서 SparseTable 에 2^i 의 조상까지의 경로에 최소와 최대를 저장할 배열을 두개 더 선언한다. pmax[][] : 2 ^ i 까지의 조상으로 가는 경로에 최댓값을 저장 pmin[][] : 2 ^ i 까지의 조상으로 가는 경로에 최솟값을 저장 이 두가지의 배열을 이용하면 값을 구할 수 있다. LCA 코드를 보겠다. public static nod..

백준 1761 (정점들의 거리) - SparseTable 풀이

문제 N(2 ≤ N ≤ 40,000)개의 정점으로 이루어진 트리가 주어지고 M(1 ≤ M ≤ 10,000)개의 두 노드 쌍을 입력받을 때 두 노드 사이의 거리를 출력하라. 풀이 conpulake.tistory.com/62 백준 1761 (정점들의 거리) - LCA 풀이 문제 N(2 ≤ N ≤ 40,000)개의 정점으로 이루어진 트리가 주어지고 M(1 ≤ M ≤ 10,000)개의 두 노드 쌍을 입력받을 때 두 노드 사이의 거리를 출력하라. 풀이 선형 시간의 LCA 알고리즘을 사용하였다. 해 conpulake.tistory.com 앞서 선형방식으로 간단하게 풀었지만 SparseTable을 이용해서 풀면 시간복잡도가 훨씬 줄어든다. conpulake.tistory.com/61 백준 11438 ( LCA 2) ..

백준 11438 (LCA 2) - 최소공통조상(HLD 풀이)

문제 N(2 ≤ N ≤ 100,000)개의 정점으로 이루어진 트리가 주어진다. 트리의 각 정점은 1번부터 N번까지 번호가 매겨져 있으며, 루트는 1번이다. 두 노드의 쌍 M(1 ≤ M ≤ 100,000)개가 주어졌을 때, 두 노드의 가장 가까운 공통 조상이 몇 번인지 출력한다. 풀이 최소 공통 조상(Lowest Common Ancestror)을 찾는 문제다. 방식은 여러가지가 있겠지만 HLD(Heavy-Light Decomposition)의 Heavy-Edge 와 Light-Edge 로 구분한 것을 이용해 트리를 분할하여 푸는 방식을 이용하여 풀었다. Heavy-Edge : 각 정점에서 아래로 뻗어나가는 간선중에서 가장 무거운 간선을 의미한다.( 여기서 무겁다는 것은 자식이 가장 많은 정점으로 이어지는 ..