Notice
Recent Posts
Recent Comments
Link
«   2026/02   »
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
Archives
Today
Total
관리 메뉴

hwooo

BOJ (C/C++, Java) 10159번: 저울 본문

Study/Algorithm

BOJ (C/C++, Java) 10159번: 저울

hwooo 2025. 1. 14. 23:26

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

 


풀이

처음엔 dfs로 연결된 노드들을 탐색하려 했으나, 같은 루프에 있는 값인지를 확인하기 어려워 답을 봤다.

플로이드-워셜을 모든 노드 간의 관계를 조회하도록 하는 방법을 사용했는데 떠올리지 못 했다.

 

풀이 참고

https://loosie.tistory.com/264

 

[BOJ] 백준 10159번 저울 (Java)

#10159 저울 난이도 : 골드 3 유형 : 그래프/ 플로이드-와샬 10159번: 저울 첫 줄에는 물건의 개수 N 이 주어지고, 둘째 줄에는 미리 측정된 물건 쌍의 개수 M이 주어진다. 단, 5 ≤ N ≤ 100 이고, 0 ≤ M

loosie.tistory.com

 


C/C++ 코드

#include <cstdio>
#include <vector>
#include <string>

using namespace std;

int N;
int map[100][100];

int main() {
    // input
    int M;
    scanf("%d\n%d", &N, &M);


    for (int i = 0; i < N; i++) 
        map[i][i] = 1;

    for (int i = 0; i < M; i++) {
        int a, b;
        scanf("%d %d", &a, &b);
        map[a - 1][b - 1] = 1;
        map[b - 1][a - 1] = -1;
    }

    // search
    for (int k = 0; k < N; k++) {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (map[i][k] == 1 && map[k][j] == 1)
                    map[i][j] = 1;

                if (map[i][k] == -1 && map[k][j] == -1)
                    map[i][j] = -1;
            }
        }
    }

    // output
    for (int i = 0; i < N; i++) {
        int known = 0;
        for (int j = 0; j < N; j++) {
            if (map[i][j] != 0)
                known++;
        }
        printf("%d\n", N - known);
    }

    return 0;
}

 

Java 코드

import java.io.*;

public class Main {
    private static int N;
    private static int[][] map;

    public static void main(String[] args) throws IOException {
        // input
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

        N = Integer.parseInt(bf.readLine());
        int M = Integer.parseInt(bf.readLine());

        map = new int[N][N];
        for (int i = 0; i < N; i++)
            map[i][i] = 1;

        for (int i = 0; i < M; i++) {
            String[] input = bf.readLine().split(" ");
            int a = Integer.parseInt(input[0]);
            int b = Integer.parseInt(input[1]);
            map[a - 1][b - 1] = 1;
            map[b - 1][a - 1] = -1;
        }

        // search
        for (int k = 0; k < N; k++) {
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    if(map[i][k] == 1 && map[k][j] == 1)
                        map[i][j] = 1;

                    if(map[i][k] == -1 && map[k][j] == -1)
                        map[i][j] = -1;
                }
            }
        }

        // output
        for (int i = 0; i < N; i++) {
            int known = 0;
            for (int j = 0; j < N; j++) {
                if (map[i][j] != 0) known++;
            }
            System.out.println(N - known);
        }
    }
}