반응형
01-11 16:15
Today
Total
«   2025/01   »
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 31
관리 메뉴

개발하는 고라니

[백준] 2617번 : 구슬 찾기 본문

Programming/백준

[백준] 2617번 : 구슬 찾기

조용한고라니 2021. 3. 14. 03:24
반응형
 

2617번: 구슬 찾기

모양은 같으나, 무게가 모두 다른 N개의 구슬이 있다. N은 홀수이며, 구슬에는 번호가 1,2,...,N으로 붙어 있다. 이 구슬 중에서 무게가 전체의 중간인 (무게 순서로 (N+1)/2번째) 구슬을 찾기 위해서

www.acmicpc.net


[DFS]

입력 N은 홀수로만 주어지기 때문에 중간을 (n + 1) / 2로 표현한듯 하다.

 

int[100][2] 배열을 준비하여 int[i][0]에는 i 구슬보다 가벼운 구슬, int[i][1]에는 i 구슬보다 무거운 구슬의 개수를 저장하도록 한다.

 

n회 반복문을 돌며 현재 구슬의 무거운 구슬의 개수 또는 가벼운 구슬의 개수가 (n + 1) / 2개 이상일 때 그 구슬은 가운데의 구슬에 들어갈 수 없다.

# Code </>

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {

    static boolean[] visit;
    static int[][] dp = new int[100][2];
    static List<Integer>[] list = new ArrayList[100];

    static void DFS(int current, int start){

        visit[current] = true;

        for(int next : list[current])
            if(!visit[next]) {
                dp[start][0]++; //0 : 나보다 가벼운거
                dp[next][1]++; // 1 : 나보다 무거운거
                DFS(next, start);
            }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        int half = (n + 1) / 2;
        for(int i=1; i<=n; i++) {
            list[i] = new ArrayList<>();
        }

        for(int i=0; i<m; i++){
            st = new StringTokenizer(br.readLine());

            int heavy = Integer.parseInt(st.nextToken());
            int light = Integer.parseInt(st.nextToken());

            list[heavy].add(light);
        }

        for(int i=1; i<=n; i++) {
            visit = new boolean[100];
            DFS(i, i);
        }

        int result = 0;
        for(int i=1; i<=n; i++)
            if(dp[i][0] >= half || dp[i][1] >= half)
                result++;

        System.out.println(result);
    }
}
반응형

'Programming > 백준' 카테고리의 다른 글

[백준] 13565번 : 침투  (0) 2021.03.14
[백준] 2512번 : 예산  (0) 2021.03.14
[백준] 1058번 : 친구  (0) 2021.03.14
[백준] 9019번 : DSLR  (0) 2021.03.13
[백준] 10816번 : 숫자 카드 2  (0) 2021.03.13
Comments