Algorithm/백준
[백준] 10159 저울
SSONGMI
2021. 6. 11. 21:29
반응형
문제 출처: https://www.acmicpc.net/problem/10159
10159번: 저울
첫 줄에는 물건의 개수 N 이 주어지고, 둘째 줄에는 미리 측정된 물건 쌍의 개수 M이 주어진다. 단, 5 ≤ N ≤ 100 이고, 0 ≤ M ≤ 2,000이다. 다음 M개의 줄에 미리 측정된 비교 결과가 한 줄에 하나씩
www.acmicpc.net
1. 입력
: 첫 줄에는 물건의 개수 N 이 주어지고, 둘째 줄에는 미리 측정된 물건 쌍의 개수 M이 주어진다.
: 단, 5 ≤ N ≤ 100 이고, 0 ≤ M ≤ 2,000이다. 다음 M개의 줄에 미리 측정된 비교 결과가 한 줄에 하나씩 주어진다.
: 각 줄에는 측정된 물건 번호를 나타내는 두 개의 정수가 공백을 사이에 두고 주어지며, 앞의 물건이 뒤의 물건보다 더 무겁다.
2. 출력
: 여러분은 N개의 줄에 결과를 출력해야 한다.
: i 번째 줄에는 물건 i 와 비교 결과를 알 수 없는 물건의 개수를 출력한다.
3. 풀이
: 플로이드-와샬 알고리즘을 사용해 풀 수 있다.
: 먼저 입력값들을 A가 B보다 무겁다면 인접행렬의 A행 B열 값을 1로 B행 A열 값을 -1로 표시해 놓는다.
: 플로이드-와샹 알고리즘을 사용해 각각의 값에 접근하면서 만약 경유지를 통했을 때 양쪽 다 1 또는 -1 가지게 된다면
i번째와 k번째를 비교할 수 있다는 뜻이므로 그 값을 i행 k열에 넣어준다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static StringTokenizer st;
static int N, M;
static int[][] adj;
public static void main(String[] args) throws Exception{
N = Integer.parseInt(br.readLine());
M = Integer.parseInt(br.readLine());
adj = new int[N+1][N+1];
for(int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int v1 = Integer.parseInt(st.nextToken());
int v2 = Integer.parseInt(st.nextToken());
adj[v1][v2] = 1;
adj[v2][v1] = -1;
}
for(int j = 1; j < N+1; j++) {
for(int i = 1; i < N+1; i++) {
if(i == j) continue;
for(int k = 1; k < N+1; k++) {
if(k == i || k==j) continue;
if(adj[i][j] != 0 && adj[i][j]==adj[j][k])adj[i][k] = adj[i][j];
}
}
}
int res = 0;
for(int i = 1; i < N+1; i++) {
int cnt = 0;
for(int j = 1; j< N+1; j++) {
if(i == j) continue;
if(adj[i][j] == 0) cnt++;
}
sb.append(cnt+"\n");
}
System.out.println(sb);
}
}
반응형