[알고리즘] 2252. 줄 세우기

2024. 2. 25. 22:43Algorithm/with Java

0. 문제

 

 

2252번: 줄 세우기

첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의

www.acmicpc.net

 


1. 문제 이해

 

  1. 위상 정렬
  2. BFS

 


2. 제출

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Queue;
import java.util.StringTokenizer;

public class BOJ2252 {

	static int N, M; // 정점의 수, 간선의 수
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		N = Integer.parseInt(st.nextToken()); // 정점
		M = Integer.parseInt(st.nextToken()); // 간선
		
		ArrayList<Integer>[] list = new ArrayList[N+1]; // 1 ~ N
		int size = N+1;
		for(int i=0; i<size; i++) {
			list[i] = new ArrayList<Integer>();
		}
		
		// 진입 차수 관리
		int[] inDegree = new int[N+1];
		// 연결 리스트
		int from, to;
		for(int i=0; i<M; i++) {
			st = new StringTokenizer(br.readLine());
			from = Integer.parseInt(st.nextToken());
			to = Integer.parseInt(st.nextToken());
			list[from].add(to); 
			inDegree[to]++; // 진입 차수 개수를 센다.

		}
		// 구현 (위상 정렬)(BFS로 구현)
		ArrayList<Integer> res = new ArrayList<>();
		Queue<Integer> q = new ArrayDeque<>();
		// 1. 진입 차수가 0인 노드를 큐에 넣는다.
		for(int i=1; i<size; i++) { // 1 ~ N
			if(inDegree[i]==0) q.offer(i);
		}
		while(!q.isEmpty()) {
			// 2. 꺼낸 노드와 인접한 모든 노드들에 대하여 간선을 제거한다. (= 진입 차수를 1 감소)
			int cur = q.poll();
			res.add(cur);
			for(int idx : list[cur]) {
				inDegree[idx]--;
				// 3. 간선 제거 후 진입 차수가 0이 된 노드를 큐에 넣는다.
				if(inDegree[idx] == 0)
					q.offer(idx);
			}
		}
		// res.size() == N이면 위상 정렬 성공
		// res.size() != N이면 위상 정렬 실패
		
		// 출력
		StringBuffer sb = new StringBuffer();
		for(Integer i : res) {
			sb.append(i).append(" ");
		}
		System.out.println(sb);
		br.close();
	}
}

 


'Algorithm > with Java' 카테고리의 다른 글

[알고리즘] 풀었던 문제 (240220 ~ 22)  (0) 2024.02.25
[알고리즘] 1260. DFS와 BFS  (0) 2024.02.25
[Java] 그래프  (0) 2024.02.25
[알고리즘] 풀었던 문제 (240213 ~ 16)  (0) 2024.02.19
[알고리즘] 7576. 토마토  (0) 2024.02.19