[Algorithm] ๐Ÿ“„๋ฐฑ์ค€ 1766 ๋ฌธ์ œ์ง‘

HaJingJingยท2021๋…„ 9์›” 3์ผ
0

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
118/119

0. ๋ฌธ์ œ

๋ฏผ์˜ค๋Š” 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€ ์ด N๊ฐœ์˜ ๋ฌธ์ œ๋กœ ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ œ์ง‘์„ ํ’€๋ ค๊ณ  ํ•œ๋‹ค. ๋ฌธ์ œ๋Š” ๋‚œ์ด๋„ ์ˆœ์„œ๋กœ ์ถœ์ œ๋˜์–ด ์žˆ๋‹ค. ์ฆ‰ 1๋ฒˆ ๋ฌธ์ œ๊ฐ€ ๊ฐ€์žฅ ์‰ฌ์šด ๋ฌธ์ œ์ด๊ณ  N๋ฒˆ ๋ฌธ์ œ๊ฐ€ ๊ฐ€์žฅ ์–ด๋ ค์šด ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค.

์–ด๋–ค ๋ฌธ์ œ๋ถ€ํ„ฐ ํ’€๊นŒ ๊ณ ๋ฏผํ•˜๋ฉด์„œ ๋ฌธ์ œ๋ฅผ ํ›‘์–ด๋ณด๋˜ ๋ฏผ์˜ค๋Š”, ๋ช‡๋ช‡ ๋ฌธ์ œ๋“ค ์‚ฌ์ด์—๋Š” '๋จผ์ € ํ‘ธ๋Š” ๊ฒƒ์ด ์ข‹์€ ๋ฌธ์ œ'๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 1๋ฒˆ ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ๋‚˜๋ฉด 4๋ฒˆ ๋ฌธ์ œ๊ฐ€ ์‰ฝ๊ฒŒ ํ’€๋ฆฐ๋‹ค๊ฑฐ๋‚˜ ํ•˜๋Š” ์‹์ด๋‹ค. ๋ฏผ์˜ค๋Š” ๋‹ค์Œ์˜ ์„ธ ๊ฐ€์ง€ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆœ์„œ๋ฅผ ์ •ํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค.

1. N๊ฐœ์˜ ๋ฌธ์ œ๋Š” ๋ชจ๋‘ ํ’€์–ด์•ผ ํ•œ๋‹ค.
2. ๋จผ์ € ํ‘ธ๋Š” ๊ฒƒ์ด ์ข‹์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋ฌธ์ œ๋Š”, ๋จผ์ € ํ‘ธ๋Š” ๊ฒƒ์ด ์ข‹์€ ๋ฌธ์ œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋จผ์ € ํ’€์–ด์•ผ ํ•œ๋‹ค.
3. ๊ฐ€๋Šฅํ•˜๋ฉด ์‰ฌ์šด ๋ฌธ์ œ๋ถ€ํ„ฐ ํ’€์–ด์•ผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๋„ค ๊ฐœ์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž. 4๋ฒˆ ๋ฌธ์ œ๋Š” 2๋ฒˆ ๋ฌธ์ œ๋ณด๋‹ค ๋จผ์ € ํ‘ธ๋Š” ๊ฒƒ์ด ์ข‹๊ณ , 3๋ฒˆ ๋ฌธ์ œ๋Š” 1๋ฒˆ ๋ฌธ์ œ๋ณด๋‹ค ๋จผ์ € ํ‘ธ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํ•˜์ž. ๋งŒ์ผ 4-3-2-1์˜ ์ˆœ์„œ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€๊ฒŒ ๋˜๋ฉด ์กฐ๊ฑด 1๊ณผ ์กฐ๊ฑด 2๋ฅผ ๋งŒ์กฑํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์กฐ๊ฑด 3์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š”๋‹ค. 4๋ณด๋‹ค 3์„ ์ถฉ๋ถ„ํžˆ ๋จผ์ € ํ’€ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์กฐ๊ฑด 3์„ ๋งŒ์กฑํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆœ์„œ๋Š” 3-1-4-2๊ฐ€ ๋œ๋‹ค.

๋ฌธ์ œ์˜ ๊ฐœ์ˆ˜์™€ ๋จผ์ € ํ‘ธ๋Š” ๊ฒƒ์ด ์ข‹์€ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด์„œ ๋ฏผ์˜ค๊ฐ€ ํ’€ ๋ฌธ์ œ์˜ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•ด ์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ
์ฒซ์งธ ์ค„์— ๋ฌธ์ œ์˜ ์ˆ˜ N(1 โ‰ค N โ‰ค 32,000)๊ณผ ๋จผ์ € ํ‘ธ๋Š” ๊ฒƒ์ด ์ข‹์€ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ •๋ณด์˜ ๊ฐœ์ˆ˜ M(1ย โ‰ค M โ‰ค 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ๋‘ ์ •์ˆ˜์˜ ์ˆœ์„œ์Œ A,B๊ฐ€ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ์ด๋Š” A๋ฒˆ ๋ฌธ์ œ๋Š” B๋ฒˆ ๋ฌธ์ œ๋ณด๋‹ค ๋จผ์ € ํ‘ธ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

ํ•ญ์ƒ ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ ํ’€ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ
์ฒซ์งธ ์ค„์— ๋ฌธ์ œ ๋ฒˆํ˜ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” 1 ์ด์ƒ N ์ดํ•˜์˜ ์ •์ˆ˜๋“ค์„ ๋ฏผ์˜ค๊ฐ€ ํ’€์–ด์•ผ ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ถœ๋ ฅํ•œ๋‹ค.

1. ์•„์ด๋””์–ด

๐Ÿ’ก ์œ„์ƒ์ •๋ ฌ + ์šฐ์„ ์ˆœ์œ„ ํ
๐Ÿ’ก ์„ ์ˆ˜๋ฌธ์ œ๋ฅผ ํ‘ผ ํ›„, ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ list์— ์ €์žฅํ•จ / ์ง„์ž…์ฐจ์ˆ˜ ๋Š˜๋ ค์คŒ
๐Ÿ’ก ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ธ ์ˆ˜๋ฅผ ์šฐ์„ ์ˆœ์œ„ ํ์— ๋„ฃ์Œ
๐Ÿ’ก ํ์—์„œ ํ•˜๋‚˜๋ฅผ ๋นผ๊ณ  ์ดํ›„์— ํ’€ ๋ฌธ์ œ๋ฅผ list์—์„œ ๊ฐ€์ ธ์™€์„œ ์ง„์ž…์ฐจ์ˆ˜ ์ค„์—ฌ์คŒ
๐Ÿ’ก ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ด ๋˜๋ฉด ์šฐ์„ ์ˆœ์œ„ ํ์— ๋„ฃ์Œ

2. ํ•ต์‹ฌ ํ’€์ด

  1. ์„ ์ˆ˜๋ฌธ์ œ๋ฅผ ํ‘ผ ํ›„, ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ list์— ์ €์žฅํ•จ / ์ง„์ž…์ฐจ์ˆ˜ ๋Š˜๋ ค์คŒ
for(int i=0; i<m; i++) {
	s = br.readLine().split(" ");
	int a = Integer.parseInt(s[0]);
	int b = Integer.parseInt(s[1]);
	list[a].add(b);
	indegree[b]++;
}
  1. ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ธ ์ˆ˜๋ฅผ ์šฐ์„ ์ˆœ์œ„ ํ์— ๋„ฃ์Œ
for(int i=1; i<n+1; i++) {
	if(indegree[i] == 0)
		pq.add(i);
}
  1. ํ์—์„œ ํ•˜๋‚˜๋ฅผ ๋นผ๊ณ  ์ดํ›„์— ํ’€ ๋ฌธ์ œ๋ฅผ list์—์„œ ๊ฐ€์ ธ์™€์„œ ์ง„์ž…์ฐจ์ˆ˜ ์ค„์—ฌ์คŒ
int cur = pq.poll();
			
for(int con : list[cur]) {
...
}
  1. ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ด ๋˜๋ฉด ์šฐ์„ ์ˆœ์œ„ ํ์— ๋„ฃ์Œ
indegree[con]--;
				
if(indegree[con] == 0) {
	pq.add(con);
}

3. ์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.PriorityQueue;

public class BOJ_1766 {
	static int[] indegree;
	static int n, m;
	static ArrayList<Integer>[] list;
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		String[] s = br.readLine().split(" ");
		n = Integer.parseInt(s[0]);
		m = Integer.parseInt(s[1]);
		indegree = new int[n+1];
		list = new ArrayList[n+1];
		
		for(int i=1; i<n+1; i++) {
			list[i] = new ArrayList<Integer>();
		}
		
		for(int i=0; i<m; i++) {
			s = br.readLine().split(" ");
			int a = Integer.parseInt(s[0]);
			int b = Integer.parseInt(s[1]);
			list[a].add(b);
			indegree[b]++;
		}
		
		String str = sort();
		bw.write(str);
		bw.flush();
		bw.close();
	}
	
	static String sort() {
		PriorityQueue<Integer> pq = new PriorityQueue<>();
		StringBuilder sb = new StringBuilder();
		
		for(int i=1; i<n+1; i++) {
			if(indegree[i] == 0)
				pq.add(i);
		}
		
		while(!pq.isEmpty()) {
			int cur = pq.poll();
			
			for(int con : list[cur]) {
				indegree[con]--;
				
				if(indegree[con] == 0) {
					pq.add(con);
				}
			}
			
			sb.append(Integer.toString(cur));
			sb.append(" ");
		}
		
		return sb.toString();
	}
}

4. ๊ฒฐ๊ณผ

์„ฑ๊ณตโœจ

profile
๐ŸŒฑ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๐ŸŒฑ

0๊ฐœ์˜ ๋Œ“๊ธ€