Skip to content

251210 : [BOJ 9470] Strahler 순서#2241

Open
sksn12 wants to merge 1 commit intomainfrom
sksn12/2237/1
Open

251210 : [BOJ 9470] Strahler 순서#2241
sksn12 wants to merge 1 commit intomainfrom
sksn12/2237/1

Conversation

@sksn12
Copy link
Contributor

@sksn12 sksn12 commented Dec 10, 2025

🚀 이슈 번호

Resolve: {#2237}

🧩 문제 해결

스스로 해결:

🔎 접근 과정

문제 해결을 위한 접근 방식을 설명해주세요.

  • 🔹 어떤 알고리즘을 사용했는지 : 위상정렬, 메모이제이션
  • 🔹 어떤 방식으로 접근했는지 : 각 노드마다 몇번 방문 되야하는지 정확히 알 수 있고 사이클이 없어 위상정렬을 이용해 문제를 풀었다. 이 과정에서 dp로 가장 큰 값과 횟수를 저장 시켜 놓고 방문 해야하는 횟수가 끝나면 해당 값을 넣어줬다.

⏱️ 시간 복잡도

시간 복잡도 분석을 작성해주세요.
최악의 경우 수행 시간은 어느 정도인지 분석합니다.

  • Big-O 표기법: O(?)
  • 이유:

💻 구현 코드

package 백준;

import java.io.*;
import java.util.*;

public class Strahler순서 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int T=Integer.parseInt(st.nextToken());

        for (int tc = 0; tc < T; tc++) {
            st=new StringTokenizer(br.readLine());
            int K=Integer.parseInt(st.nextToken());
            int M=Integer.parseInt(st.nextToken());
            int P=Integer.parseInt(st.nextToken());

            List<Integer>[] list=new List[M+1];
            int[] degree=new int[M+1];
            int[] max=new int[M+1];
            int[] cnt=new int[M+1];
            int[] strahler=new int[M+1];

            for (int i = 1; i <= M; i++) {
                list[i]=new ArrayList();
            }

            for (int i = 0; i < P; i++) {
                st=new StringTokenizer(br.readLine());
                int p=Integer.parseInt(st.nextToken());
                int c=Integer.parseInt(st.nextToken());

                list[p].add(c);
                degree[c]+=1;
            }

            Queue<Integer> q=new ArrayDeque<>();

            for (int i = 1; i <=M ; i++) {
                if (degree[i]==0){
                    q.offer(i);
                    strahler[i]=1;
                }
            }

            while (!q.isEmpty()){
                int now=q.poll();

                for (int i = 0; i < list[now].size(); i++) {
                    int next=list[now].get(i);

                    if(strahler[now]>max[next]){
                        max[next]=strahler[now];
                        cnt[next]=1;
                    }else if(strahler[now]==max[next]){
                        cnt[next]+=1;
                    }

                    degree[next]-=1;

                    if(degree[next]==0){
                        if (cnt[next] >= 2) {
                            strahler[next] = max[next] + 1;
                        } else {
                            strahler[next] = max[next];
                        }
                        q.offer(next);
                    }
                }
            }

            System.out.println(K + " " + strahler[M]);
        }
    }
}

@sksn12 sksn12 self-assigned this Dec 10, 2025
@sksn12 sksn12 linked an issue Dec 10, 2025 that may be closed by this pull request
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.

251210 : 코딩테스트

1 participant