알고리즘/백준
백준 10159 (저울) - java
김다미김태리신시아
2023. 3. 4. 21:05
https://www.acmicpc.net/problem/10159
10159번: 저울
첫 줄에는 물건의 개수 N 이 주어지고, 둘째 줄에는 미리 측정된 물건 쌍의 개수 M이 주어진다. 단, 5 ≤ N ≤ 100 이고, 0 ≤ M ≤ 2,000이다. 다음 M개의 줄에 미리 측정된 비교 결과가 한 줄에 하나씩
www.acmicpc.net
import java.io.*;
import java.util.*;
public class Main {
static int n = 0;
static int m = 0;
static boolean[][] big = new boolean[101][101]; // k번째 보다 작은수에 대해 search
static boolean[][] small = new boolean[101][101]; //k번째 보다 큰 수에 대해 search
static boolean[] visit =new boolean[101]; // 방문 배열
static int result = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
m = Integer.parseInt(st.nextToken());
for(int i=1;i<=m;i++)
{
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
big[x][y] = true; // x는 y보다 크다
small[y][x] = true; // y는 x보다 작다
}
visit[1] = true;
for(int i=1;i<=n;i++) {
search(i); // i보다 작은 수 찾기
search2(i); // i보다 큰 수 찾기
System.out.println(n -1 -result);
visit = new boolean[101]; // 방문 배열 초기화
result = 0; // 개수 초기화
}
}
static void search(int k)
{
for(int i=1;i<=n;i++)
{
if(k==i)
continue;
if(!visit[i])
{
if(big[k][i]) // 해당 수 보다 작은 수를 찾은 경우
{
visit[i] = true; // 방문 처리
result++;
search(i); // dfs
}
}
}
}
static void search2(int k)
{
for(int i=1;i<=n;i++)
{
if(k==i)
continue;
if(!visit[i])
{
if(small[k][i]) // 해당 수보다 큰 수를 찾은 경우
{
visit[i] = true;
result++;
search2(i); // dfs
}
}
}
}
}
플로이드-워셜 알고리즘으로 푼 경우도 있다 . 하지만 문제를 봤을 때 직관적으로 푼 풀이를 올렸다.