본문 바로가기

카테고리 없음

그래프 - 순위

https://programmers.co.kr/learn/courses/30/lessons/49191

 

코딩테스트 연습 - 순위

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

programmers.co.kr

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package justStudying;
 
import java.util.LinkedList;
 
public class test2_20220206 {
    
    static class Player {
        int mIdx;    //나
        int rank;    //순위
        int total;    //토탈판수
        int played;    //플레이판수
        LinkedList<Integer> winList = new LinkedList<Integer>();    //내가이긴상대
        LinkedList<Integer> loseList = new LinkedList<Integer>();    //내가진상대
        
        public Player(int m, int t) {    //나idx,순위가 판정되는 토탈판수
            mIdx = m;
            total = t;
        }
        
        public void win(int d) {    //이김
            if(!winList.contains(d)) {    //안들어가있으면
                winList.add(d);
                played++;
            }
            getRank();
        }
        
        public void lose(int d) {    //짐
            if(!loseList.contains(d)) {    //안들어가있으면
                loseList.add(d);
                played++;
            }
            getRank();
        }
        
        public int getRank() {    //순위매기기
            if(total == played) {
                rank = total - winList.size() + 1;
//                System.out.println(mIdx + "선수 : " + rank + "등");
                return rank;
            }
            
            return -1;
        }
        
        public void getBoard() {    //전적 출력
            System.out.print(mIdx+"선수 winList : [");
            for(int i=0; i<winList.size(); i++) {
                System.out.print(winList.get(i) + " ");
            }
            System.out.print("] loseList : [");
            for(int i=0; i<loseList.size(); i++) {
                System.out.print(loseList.get(i) + " ");
            }
            System.out.println("]");
        }
    }
    
    public static int solution(int n, int[][] results) {
        int answer = 0;
        
        Player[] playerList = new Player[n];
        for(int i=0; i<playerList.length; i++) {
            playerList[i] = new Player(i,n-1);
        }
        
        //초기결과 셋팅
        for(int i=0; i<results.length; i++) {
            playerList[results[i][0]-1].win(results[i][1]-1);
            playerList[results[i][1]-1].lose(results[i][0]-1);
        }
        
        //가지고있는 결과들을 기준으로 상하관계[함축되어있는 경기결과를 유추]
        for(int i=0; i<playerList.length; i++) {
            int wTemp = -1;    //이긴놈 idx
            int lTemp = -1;    //진놈 idx
            for(int j=0; j<playerList[i].winList.size(); j++) {
                lTemp = playerList[i].winList.get(j);
                for(int k=0; k<playerList[i].loseList.size(); k++) {
                    wTemp = playerList[i].loseList.get(k);
                    
                    playerList[wTemp].win(lTemp);
                    playerList[lTemp].lose(wTemp);
                }
            }
        }
        
        //확정된 순위 산출
        for(int i=0; i<playerList.length; i++) {
            System.out.println(playerList[i].mIdx + "선수 " + playerList[i].played + "판함");
            playerList[i].getBoard();
            if(playerList[i].getRank() != -1) answer++;
        }
        
        return answer;
    }
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
//        int n = 8;
//        int[][] results = {{1, 2}, {2, 3}, {3, 4}, {5, 6}, {6, 7}, {7, 8}};
        int n = 5;
        int[][] results = {{14}, {42}, {25}, {53}};
        System.out.println(solution(n, results));
    }
 
}
 
cs