💡Problem Solving/BOJ

[BOJ 10159] 저울 (Java)

gom20 2022. 1. 1. 17:51

문제

https://www.acmicpc.net/problem/10159

 

10159번: 저울

첫 줄에는 물건의 개수 N 이 주어지고, 둘째 줄에는 미리 측정된 물건 쌍의 개수 M이 주어진다. 단, 5 ≤ N ≤ 100 이고, 0 ≤ M ≤ 2,000이다. 다음 M개의 줄에 미리 측정된 비교 결과가 한 줄에 하나씩

www.acmicpc.net

 

풀이

플로이드 와샬 알고리즘을 사용하여 풀 수 있다.

ex) 1 > 2 , 2 > 3   ===>  1 > 3

 

소스코드

package floyd;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class BOJ10159 {
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	
		int N = Integer.parseInt(br.readLine());
		int M = Integer.parseInt(br.readLine());
		
		int map[][] = new int[N+1][N+1];
		
		StringTokenizer st = null;
		for(int i = 1; i <= M; i++) {
			st = new StringTokenizer(br.readLine());
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			// a > b
			map[a][b] = 1;
			map[b][a] = -1;
		}
		
		for(int k = 1; k <= N; k++) {
			for(int i = 1; i <= N; i++) {
				for(int j = 1; j <= N; j++) {
					if(map[i][k] == 1 && map[k][j] == 1) {
						map[i][j] = 1;
						map[j][i] = -1;
					}
					if(map[i][k] == -1 && map[k][j] == -1) {
						map[i][j] = -1;
						map[j][i] = 1;
					}
				}
			}
		}
		
		for(int i = 1; i <= N; i++) {
			int cnt = 0;
			for(int j = 1; j <= N; j++) {
				if(i == j) continue;
				if(map[i][j] == 0) cnt++;
			}
			System.out.println(cnt);
		}	
	}
}

'💡Problem Solving > BOJ' 카테고리의 다른 글

[BOJ 3190] 뱀 (Python)  (0) 2022.11.16
[BOJ 1167] 트리의 지름 (Java)  (0) 2022.01.02
[BOJ 11779] 최소비용 구하기 2 (Java)  (0) 2021.12.30
[BOJ 6603] 로또 (Java)  (0) 2021.12.28
[BOJ 1261] 알고스팟 (Java)  (0) 2021.12.27