Algorithm Test/프로그래머스

[프로그래머스] 순위 (JAVA)

김맷돌 2021. 5. 4. 18:59
반응형

🏆 순위

 

BFS를 이용해 해결할 수 있다.

 


문제 설명

 

n명의 권투선수가 권투 대회에 참여했고 각각 1번부터 n번까지 번호를 받았습니다. 권투 경기는 1대1 방식으로 진행이 되고, 만약 A 선수가 B 선수보다 실력이 좋다면 A 선수는 B 선수를 항상 이깁니다. 심판은 주어진 경기 결과를 가지고 선수들의 순위를 매기려 합니다. 하지만 몇몇 경기 결과를 분실하여 정확하게 순위를 매길 수 없습니다.

선수의 수 n, 경기 결과를 담은 2차원 배열 results가 매개변수로 주어질 때 정확하게 순위를 매길 수 있는 선수의 수를 return 하도록 solution 함수를 작성해주세요.

 

제한 사항

  • 선수의 수는 1명 이상 100명 이하입니다.
  • 경기 결과는 1개 이상 4,500개 이하입니다.
  • results 배열 각 행 [A, B]는 A 선수가 B 선수를 이겼다는 의미입니다.
  • 모든 경기 결과에는 모순이 없습니다.

 

입출력 예

 

n results return
5 [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]] 2

 


🔑 IDEA

이 문제와 매우 흡사한 백준 2458번: "키 순서" 라는 문제가 있다. 

문제의 설명만 다르고, 푸는 방법은 똑같다. 

해당 문제에 대한 풀이는 여기에 설명해두었으니 참고하면 좋을 듯 하다. 

 

💡  나의 풀이

import java.util.*;

class Node {
    int win;
    int defeat;
}

class Solution {
    static List<Integer>[] adj;
    static Node[] nodes;
    static int N;
    
    public int solution(int n, int[][] results) {
        adj = new ArrayList[n+1];
        nodes = new Node[n+1];
        N = n;
        
        for(int i=0; i<N+1; i++) {
            adj[i] = new ArrayList<>();
            nodes[i] = new Node();
        }
        
        for(int i=0; i<results.length; i++) {
            int winner = results[i][0];
            int loser = results[i][1];
            
            adj[winner].add(loser);
        }
        
        nodeUpdate();
        return hasRank();
    }
    
    private void nodeUpdate() {    
        for(int i=1; i<N+1; i++) {
            Queue<Integer> queue = new LinkedList<>();
            boolean[] visited = new boolean[N+1];
            
            visited[i] = true;
            queue.offer(i);
            
            while(!queue.isEmpty()) {
                int winner = queue.poll();
                
                for(int loser: adj[winner]) {
                    if(visited[loser]) continue;
                    visited[loser] = true;
                    queue.offer(loser);
                    nodes[i].win++;
                    nodes[loser].defeat++;
                }
            }
        }
    }
    
    private int hasRank() {
        int count = 0;
        for(Node node: nodes) {
            if(node.win + node.defeat == N-1) count++;
        }
        return count;
    }
}

 

 


 

 

코딩테스트 연습 - 순위

5 [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]] 2

programmers.co.kr

 

반응형