GreatAlgorithm-Study / AlgorithmStudy

🌟알고리즘 대장정🌟
6 stars 4 forks source link

[11주차_화요일] 정점들의 거리 #144

Open yeongleej opened 4 days ago

yeongleej commented 4 days ago

LCA(최소 공통 조상)을 공부할 수 있는 문제였습니다!

### 🤔 시간복잡도 고려사항

### 💡 풀이 아이디어
KodaHye commented 2 days ago

🤔 시간복잡도 고려사항

💡 풀이 아이디어

image

  1. 트리의 정보를 간선리스트로 입력받음
    • Node(int e, int w), ArrayList<Node> adj[] 사용
  2. 시작지점을 1로 설정하여 BFS 시작하고, dis, depth, p 값 채우기
    • int[] dis: 루트로부터 자기 자신까지의 거리
    • int[] depth: 트리에서 자신의 depth 구하기
    • int[] p: 자기 자신의 직접적인 부모가 누구인지 저장
  3. long LCA(int a, int b)
    • a, b의 최소공통조상 구하고, 두 점 간 사이 거리 구하기
      • (루트 ~ a 까지의 거리) + (루트 ~ b 까지의 거리) - 2 * (루트 ~ 최소공통조상까지의 거리)
    • 최소공통조상을 구할 때, abdepth가 다르다면 depth를 작은걸로 맞춰줘야 됨
      • depth는 항상 adepth가 작다고 설정함
      • depth 맞추고 한 칸씩 단계별로 자기 자신을 부모로 값을 바꾸면서, a == b가 될 때까지 반복

한 번 풀어봤던 문제여서 문제 접근 방법을 알고 있었습니다!

baexxbin commented 2 days ago

🤔 시간복잡도 고려사항

💡 풀이 아이디어

LCA... 처음 알게된 개념인데 쉽지 않네요.... 개념 공부하면서 했는데도.. 저 근데 궁금한게 parents에서 최대 부모값 배열 크기를 설정할때, 트리의 최대높이(logN+1)로 설정하는데 편향된 트리일 경우 크기가 더 커야할텐데 왜 그냥 logN+1로 사용하는건지 아시나요....??

KodaHye commented 2 days ago

수빈님 질문에 대해 답변 드리겠습니다! (어디에 답변해야될지 모르겠어서,,, 여기에 올려욤,,) 우선 LCA를 구하는 방법이 크게 두 가지가 있는데, 첫 번째가 일반적인 방법으로 제가 사용한 방법이고, 수빈님이 하신건 질의의 개수가 많을 때 사용하는 개선된 LCA입니다. 개선된 LCA에서 parents 배열의 크기를 (logN + 1)로 설정해야 되는 이유는 이게 단순히 트리의 최대 깊이를 의미하는 것이 아니라, 어떤 지점에 대해 2^k 까지의 부모 노드가 뭔지 저장해야 되기 때문에 그런 것으로 알고 있습니다. 그래서 편향트리가 되더라도 상관없게 되는 것 같습니다!

예시를 2개 그려봤는데요,, 혹시 잘못된거 같은 내용 있음 말해주세요!!

yeahdy commented 2 days ago

🤔 시간복잡도 고려사항

💡 풀이 아이디어

정말... 너무..어렵네요... 설명은 이해가 가는데 dp 배열에 메모리제이션 구현 코드 부분이 너무 이해하기 어려웠어요...

yeongleej commented 1 day ago

🤔 시간복잡도 고려사항

=> 다익스트라 이용 : N O(N logN) -> 시간초과 => 최소 공통 조상(LCA) : O(N M) -> 가능

💡 풀이 아이디어