Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

15-Redish03 #59

Merged
merged 1 commit into from
Feb 21, 2024
Merged

15-Redish03 #59

merged 1 commit into from
Feb 21, 2024

Conversation

Redish03
Copy link
Collaborator

πŸ”— 문제 링크

트리의 지름

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

2h

✨ μˆ˜λ„ μ½”λ“œ

❓ 문제 이해

트리의 μ§€λ¦„μ΄λž€, νŠΈλ¦¬μ—μ„œ μž„μ˜μ˜ 두 점 μ‚¬μ΄μ˜ 거리 쀑 κ°€μž₯ κΈ΄ 것을 λ§ν•œλ‹€. 트리의 지름을 κ΅¬ν•˜μ—¬λΌ.

🚢 문제 μ ‘κ·Ό

  • μ²˜μŒμ—λŠ” ν•œ 점과 λͺ¨λ“  점에 λŒ€ν•΄μ„œ μ΅œμ†Œ 경둜λ₯Ό μ°ΎλŠ” λ‹€μ΅μŠ€νŠΈλΌ 인쀄 μ•Œμ•˜λ‹€. μ΅œμ†Œ -> μ΅œλŒ€λ‘œ ν•˜λ©΄ λ˜μ§€ μ•Šμ„κΉŒ?λΌλŠ” μ•ˆμΌν•œ 생각을 ν–ˆλ‹€.
  • 트리이고 각 λ…Έλ“œκΉŒμ§€ 거리 정보가 λ‹΄κ²¨μžˆλ‹€. λ”°λΌμ„œ, BFSλ‚˜ DFS같이 탐색도 μƒκ°ν–ˆλŠ”λ°, BFS λ˜ν•œ μ΅œμ†Œ κ²½λ‘œμ— κ°€κΉŒμš°λ―€λ‘œ DFSλ₯Ό μ„ νƒν–ˆλ‹€.

풀이

  • νŠΈλ¦¬μ—λŠ” 각 λ…Έλ“œ node에 λŒ€ν•΄μ„œ <μ—°κ²°λœ λ…Έλ“œ, κ·Έ λ…Έλ“œμ™€μ˜ 거리> κ°€ μ €μž₯λ˜μ–΄μžˆλ‹€. μ΄λŠ” μ•„λž˜μ™€ κ°™λ‹€.
vector<vector<pair<int, int>>> tree(100001);
tree[node][connected_node] = distance;
  • pathμ—λŠ” λ°©λ¬Έν•œ 적 μžˆλŠ” λ…Έλ“œμΈμ§€ 확인해쀀닀. 인덱슀의 λ²ˆν˜ΈλŠ” λ…Έλ“œμ˜ λ²ˆν˜Έκ°€ λœλ‹€.
  • 트리의 지름은 μž„μ˜μ˜ 점 두 개 의 거리λ₯Ό ν™•μΈν•œλ‹€. λ”°λΌμ„œ, 1번 λ…Έλ“œ μ—μ„œ μ‹œμž‘ν•΄ 1λ²ˆλ…Έλ“œμ—μ„œ μ΅œλŒ€ 거리의 λ…Έλ“œμΈ max_nodeλ₯Ό κ΅¬ν•˜κ³ , 이 max_nodeμ—μ„œ λ‹€μ‹œ μ‹œμž‘ν•΄ 이 μ μ—μ„œ 각 λ…Έλ“œμ— λŒ€ν•œ μ΅œλŒ€ 거리λ₯Ό κ΅¬ν•œλ‹€. 그러면 μž„μ˜μ˜ 점 두 개λ₯Ό 얻을 수 μžˆλ‹€. λ”°λΌμ„œ, DFSλ₯Ό 1->max_node, max_node -> ?둜 두 번 λ™μž‘μ‹œν‚€κ²Œ λœλ‹€.
  • dfs ν•¨μˆ˜λŠ” μ΅œλŒ€ 거리λ₯Ό max_dist에 μ €μž₯μ‹œν‚€κ³ , max_nodeλ₯Ό κ΅¬ν•œλ‹€.
void dfs(int node, int distance)
{
// λ°©λ¬Έν•œ 적 μžˆλŠ” λ…Έλ“œλΌλ©΄
    if (path[node])
    {
        return;
    }
// μ§€κΈˆμ˜ κ²½λ‘œκ°€ μ €μž₯λ˜μ–΄μžˆλŠ” μ΅œλŒ€ 거리보닀 클 경우
    if (distance > max_dist)
    {
        max_dist = distance;
        max_node = node;
    }
// node에 λŒ€ν•œ λ°©λ¬Έ 처리
    path[node] = true;

    for (int i = 0; i < tree[node].size(); i++)
    {
        int nnode = tree[node][i].first; // firstμ—λŠ” node와 μ—°κ²°λœ λ…Έλ“œ
        int ndist = tree[node][i].second; // secondμ—λŠ” node와 μ—°κ²°λœ λ…Έλ“œ μ‚¬μ΄μ˜ 거리가 μ €μž₯.
        dfs(nnode, distance + ndist); // μ—°κ²°λœ λ…Έλ“œμ™€ κΈ°μ‘΄ 거리에 node - nnode μ‚¬μ΄μ˜ 거리λ₯Ό λ”ν•΄μ„œ μž¬κ·€ 호좜
    }
}

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

질문 및 의문점

  • μ²˜μŒμ—λŠ” DFS μ½”λ“œμ˜ for λ¬Έ μ•„λž˜μ™€ 같이 μ§°λŠ”λ°..μ™œ μ œλŒ€λ‘œ λ™μž‘μ΄ μ•ˆν–ˆλŠ”μ§€ 잘 λͺ¨λ₯΄κ²ŸμŠ΅λ‹ˆλ‹€
    for (int i = 0; i < tree[node].size(); i++)
    {
        int nnode = tree[node][i].first;
        int ndist = tree[node][i].second;
        path[nnode] = true;

        dfs(nnode, distance + ndist);
        path[nnode] = false;
    }

골 2λž˜μ„œ μž”λœ© μ«„κ³  μžˆμ—ˆμ§€λ§Œ...생각보닀 별거 없을지도

@9kyo-hwang
Copy link

9kyo-hwang commented Feb 16, 2024

μ•„λž˜μ™€ 같은 νŠΈλ¦¬κ°€ μžˆλ‹€κ³  가정해보죠.
제λͺ©μ„ μž…λ ₯ν•΄μ£Όμ„Έμš”_-001 (3)

제λͺ©μ„-μž…λ ₯ν•΄μ£Όμ„Έμš”_ (1)
μž„μ˜λ‘œ 주어진 λ…Έλ“œ(μ—¬κΈ°μ„œλŠ” 1)μ—μ„œ ν•˜μœ„ λ…Έλ“œλ₯Ό λͺ¨λ‘ νƒμƒ‰ν•˜κ²Œ λ˜λŠ”λ°, μ„€λͺ…μ—μ„œ μ•Œ 수 μžˆλ“― λ°©λ¬Έ μ²΄ν¬ν•œ 기둝을 λ‹€μ‹œ ν•΄μ œν•  μ΄μœ κ°€ μ—†μŠ΅λ‹ˆλ‹€.
μ–΄μ°¨ν”Ό λ°©λ¬Έ 체크가 된 μƒν™©μ—μ„œ, μ–΄λ–€ λ…Έλ“œμ˜ μžμ‹ λ…Έλ“œλ“€μ„ νƒμƒ‰ν•˜λŠ” 건 for문을 λ„λŠ” κ³Όμ •μ—μ„œ 이루어지고 있기 λ•Œλ¬Έμ— λ°©λ¬Έ 체크λ₯Ό μ•ˆν’€μ–΄μ€˜λ„ μžμ—°μŠ€λŸ½κ²Œ λ‹€μŒ μž¬κ·€ ν•¨μˆ˜μ—μ„œ κ·Έ λ…Έλ“œλ“€μ„ κ±°μ³κ°€κ²Œ 되기 λ•Œλ¬Έμž…λ‹ˆλ‹€. 즉

    path[node] = true;

    for (int i = 0; i < tree[node].size(); i++)
    {
        int nnode = tree[node][i].first; // firstμ—λŠ” node와 μ—°κ²°λœ λ…Έλ“œ
        int ndist = tree[node][i].second; // secondμ—λŠ” node와 μ—°κ²°λœ λ…Έλ“œ μ‚¬μ΄μ˜ 거리가 μ €μž₯.
        dfs(nnode, distance + ndist); // μ—°κ²°λœ λ…Έλ“œμ™€ κΈ°μ‘΄ 거리에 node - nnode μ‚¬μ΄μ˜ 거리λ₯Ό λ”ν•΄μ„œ μž¬κ·€ 호좜
    }

이 μ½”λ“œμ—μ„œ forλ¬Έ λ°–μ—μ„œ λ°©λ¬Έ 체크λ₯Ό ν•˜λŠ” 것이 ν˜„μž¬ λ…Έλ“œλ₯Ό μƒ‰μΉ ν•˜λŠ” 것이고, for문이 ν˜„μž¬ λ…Έλ“œμ˜ μžμ‹ λ…Έλ“œ(μ„œλΈŒ 트리)둜 λ“€μ–΄κ°€λŠ” 과정을 μ˜λ―Έν•©λ‹ˆλ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ—

    for (int i = 0; i < tree[node].size(); i++)
    {
        int nnode = tree[node][i].first;
        int ndist = tree[node][i].second;
        
        path[nnode] = true;
        dfs(nnode, distance + ndist);
        path[nnode] = false;
    }

와 같이 λ°©λ¬Έ 체크λ₯Ό 풀어쀄 μ΄μœ κ°€ μ—†μ£ .

ꡳ이 μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μžλ©΄

void dfs(int node, int distance)
{
    if (distance > max_dist)
    {
        max_dist = distance;
        max_node = node;
    }
    
    for (int i = 0; i < tree[node].size(); i++)
    {
        int nnode = tree[node][i].first;
        int ndist = tree[node][i].second;
        
        if(path[nnode])
        {
            continue;
        }
        
        path[nnode] = true;
        dfs(nnode, distance + ndist);
        path[nnode] = false;
    }
}

μ΄λ ‡κ²Œ 되긴 ν•˜λŠ”λ°, 이러면
image
47%μ—μ„œ μ‹œκ°„ 초과 λ‚©λ‹ˆλ‹€.


1967 트리의 지름 μ—¬κΈ° λ˜‘κ°™μ€ 문제 μžˆμœΌλ‹ˆ λ‚ λ¨Ήν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€ ^________^

Copy link
Collaborator

@2secondag 2secondag left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μ½”λ“œ 잘 λ΄€μŠ΅λ‹ˆλ‹€.

문제λ₯Ό ν’€ λ•Œ dfsλ₯Ό μ‚¬μš©ν•˜μ…¨λŠ”λ° κ·Έ μ΄μœ μ— λŒ€ν•΄μ„œ 쑰금 더 μžμ„Έν•˜κ²Œ μ„€λͺ…ν•΄μ£Όμ‹€ 수 μžˆμœΌμ‹ κ°€μš”? DFSλŠ” 아직도 쑰금 μƒμ†Œν•œ 것 κ°™λ„€μš”~ λ‹€μŒμ— μ‹œλ„ν•΄ λ΄μ•Όκ² μ–΄μš”.
자격증 μ€€λΉ„ ν™”μ΄νŒ…ν•˜μ„Έμš”!

@Redish03
Copy link
Collaborator Author

μ½”λ“œ 잘 λ΄€μŠ΅λ‹ˆλ‹€.

문제λ₯Ό ν’€ λ•Œ dfsλ₯Ό μ‚¬μš©ν•˜μ…¨λŠ”λ° κ·Έ μ΄μœ μ— λŒ€ν•΄μ„œ 쑰금 더 μžμ„Έν•˜κ²Œ μ„€λͺ…ν•΄μ£Όμ‹€ 수 μžˆμœΌμ‹ κ°€μš”? DFSλŠ” 아직도 쑰금 μƒμ†Œν•œ 것 κ°™λ„€μš”~ λ‹€μŒμ— μ‹œλ„ν•΄ λ΄μ•Όκ² μ–΄μš”. 자격증 μ€€λΉ„ ν™”μ΄νŒ…ν•˜μ„Έμš”!

μš°μ„  μ£Όμ–΄μ§€λŠ” μžλ£Œκ°€ νŠΈλ¦¬ν˜•νƒœμž…λ‹ˆλ‹€. λ”°λΌμ„œ κ΅ν™©μ΄ν˜•μ΄ μœ„μ— 리뷰에 달은 것 κ³Ό 같은 ν˜•νƒœκ°€ λ©λ‹ˆλ‹€! μœ„λŠ” 이진 트리의 ν˜•νƒœμ΄μ§€λ§Œ, μ‹€μ œλ‘œλŠ” λ…Έλ“œ 밑에 더 λ‹€μ–‘ν•˜κ²Œ μ—°κ²°λœ λ…Έλ“œλ“€μ΄ μžˆμ„κ²λ‹ˆλ‹€. 보톡 이런 νŠΈλ¦¬λ“€μ„ λ‹€λ£° λ•ŒλŠ” BFS, λ‹€μ΅μŠ€νŠΈλΌ, DFS, ν”Œλ‘œμ΄λ“œ μ›Œμ…œ λ“±λ“± λ‹€μ–‘ν•œ μ•Œκ³ λ¦¬μ¦˜μ΄ μžˆμ§€λ§Œ...

우리의 λͺ©ν‘œλŠ” μ–΄λŠ ν•œ μ§€μ μ—μ„œ μ–΄λŠ ν•œ 지점 κΉŒμ§€μ˜ 거리의 μ΅œλŒ“κ°’μ„ κ΅¬ν•˜λŠ”κ²Œ λͺ©ν‘œμž…λ‹ˆλ‹€. 그러기 μœ„ν•΄μ„œλŠ” 갈 수 μžˆλŠ” κ²½λ‘œλ“€μ„ νƒμƒ‰ν•΄μ„œ λͺ©μ μ§€μΈ λ‹€λ₯Έ μ§€μ κΉŒμ§€ 도착을 ν•˜λŠ” 게 λͺ©ν‘œμž…λ‹ˆλ‹€. 1을 μ£Όμœ„λ‘œ νΌμ Έλ‚˜κ°€λŠ” ν˜•μ‹μΈ BFSκ°€ μ•„λ‹Œ, 1μ—μ„œ λΆ€ν„° μ‹œμž‘ν•΄μ„œ 쀑간 λ…Έλ“œλ“€μ„ 거치고 2λ²ˆκΉŒμ§€μ˜ 거리, 3λ²ˆκΉŒμ§€μ˜ 거리, 4λ²ˆκΉŒμ§€μ˜ 거리λ₯Ό κ΅¬ν•˜κ³  κ·Έ Nλ²ˆλ…Έλ“œκΉŒμ§€μ˜ 거리 쀑 κ°€μž₯ 큰 값을 κ΅¬ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄μ„  μœ„μ˜ λ‹€μ–‘ν•œ μ•Œκ³ λ¦¬μ¦˜λ“€ μ€‘μ—μ„œ DFSκ°€ κ°€μž₯ μ μ ˆν•˜λ‹€κ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

사싀 λΌμ›Œλ§žμΆ”κΈ° 식 μ„€λͺ…이긴 ν–ˆμŠ΅λ‹ˆλ‹€ ν•˜ν•˜ κ·Έλž˜μ„œ 문제λ₯Ό 많이 ν’€μ–΄λ³΄λŠ”κ²Œ κ²°κ΅­μ—λŠ” μ€‘μš”ν•œ 것 κ°™μ•„μš”

Copy link
Member

@bomik0221 bomik0221 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μ½”λ“œ 잘 λ΄€μ–΄μš”~ κ³ μƒν•˜μ…¨μŠ΅λ‹ˆλ‹€!
μ €λŠ” νŠΈλ¦¬κ°€ λ‚―μ„€μ–΄μ„œ κ·ΈλŸ°μ§€ μ΄ν•΄ν•˜λ €κ³  μ—¬λŸ¬λ²ˆ 읽은 것 κ°™μ•„μš”. ν™•μ‹€νžˆ μŠ€ν„°λ”” ν•˜λ©΄μ„œ μ € 혼자라면 μ ‘ν•˜μ§€ μ•Šμ•˜μ„ λΆ„μ•Όλ₯Ό 많이 μ ‘ν•˜κ²Œ λ˜λŠ” 것 κ°™μ•„ μ’‹μŠ΅λ‹ˆλ‹€. πŸ‘ 저도 μ™œ dfs둜 ν‘ΈλŠ” 것인지 κΆκΈˆν–ˆλŠ”λ°, μ΄ˆμ€λ‹˜ μ½”λ©˜νŠΈλ‘œ μ •λ¦¬λ˜μ–΄μ„œ λ”±νžˆ 더 λ“œλ¦΄ 말씀은 μ—†λ„€μš”...ν—ˆν—ˆ

+) 자격증 μ€€λΉ„ ν™”μ΄νŒ…ν•˜μ„Έμš”!!

Copy link
Member

@miniron-v miniron-v left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DFS둜 λ‹€μ–‘ν•˜κ²Œ κ΅¬ν˜„ν•΄λ³΄λ‹€κ°€, κ²°κ΅­ μ„±μš°λ‹˜ ν’€μ΄λ‘œ νšŒκ·€ν–ˆλ˜ 문제...

https://www.acmicpc.net/board/view/83695
질문 κ²Œμ‹œνŒμ— μ‰½κ²Œ μ„€λͺ…λœ 글이 μžˆμ–΄ κ°€μ Έμ™”μŠ΅λ‹ˆλ‹€.

@Redish03
Copy link
Collaborator Author

DFS둜 λ‹€μ–‘ν•˜κ²Œ κ΅¬ν˜„ν•΄λ³΄λ‹€κ°€, κ²°κ΅­ μ„±μš°λ‹˜ ν’€μ΄λ‘œ νšŒκ·€ν–ˆλ˜ 문제...

https://www.acmicpc.net/board/view/83695
질문 κ²Œμ‹œνŒμ— μ‰½κ²Œ μ„€λͺ…λœ 글이 μžˆμ–΄ κ°€μ Έμ™”μŠ΅λ‹ˆλ‹€.

직관 λ―Έμ³£λ‹€,,,

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants