Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Life Engineering

[BOJ 10159] 저울 (Java) 본문

Problem Solving

[BOJ 10159] 저울 (Java)

흑개 2022. 4. 5. 22:39

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

 

10159번: 저울

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

www.acmicpc.net

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main_BOJ_10159 {
	static int N, M;
	static int[][] floyd;
	static int INF=987654321;
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st=null;
		N=Integer.parseInt(br.readLine());
		M=Integer.parseInt(br.readLine());
		floyd=new int[N+1][N+1];
		for (int i = 0; i < N+1; i++) {
			Arrays.fill(floyd[i], INF);
		}
		for (int i=0; i<M; i++) {
			st=new StringTokenizer(br.readLine());
			int a=Integer.parseInt(st.nextToken());
			int b=Integer.parseInt(st.nextToken());
			floyd[a][b]=1;
			floyd[b][a]=-1;
			
		}
		for (int k=1; k<=N; k++) {
			for (int i=1; i<=N; i++) {
				if (i==k) continue;
				for (int j=1; j<=N; j++) {
					if (i==j || k==j) continue;
					if (floyd[i][k]!=INF && floyd[k][j]!=INF) {
						if (floyd[i][k]*floyd[k][j]>0 && floyd[i][j]>floyd[i][k]+floyd[k][j]) {
							floyd[i][j]=floyd[i][k]+floyd[k][j];
						}
					}
				}
			}
		}
		for (int i=1; i<=N; i++) {
			int cnt=0;
			for (int j=1; j<=N; j++) {
				if (i!=j && floyd[i][j]==INF) cnt++;
			}
			//System.out.println();
			System.out.println(cnt);
		}
	}

}

너무 복잡하게 풀었다..

 

다른 분의 코드를 보니(https://jow1025.tistory.com/117)

삼단논법이다: a>b b>c => a>c!

즉 이를 이용해서 (a,b)가 연결되면 floyd[a][b]=1 로 표시해주고,

floyd[a][k], floyd[k][c] => 이 2개가 서로 연결되었는지 체크하고 연결되었으면 floyd[a][c]=1로 해준다.

 

연결성을 체크할때는

a->c, c->a 양쪽을 모두 체크해준다. 

'Problem Solving' 카테고리의 다른 글

[BOJ 17471] 게리맨더링 (Java)  (0) 2022.04.06
[BOJ 2239] 스도쿠 (Java)  (0) 2022.04.06
[JUNGOL 2577] 회전 초밥(고)  (0) 2022.04.05
[SWEA 5656] 벽돌 깨기 (Java)  (0) 2022.04.05
[BOJ 1644] 소수의 연속합 (Java)  (0) 2022.04.04