코테/백준

[백준/JAVA] 20006번: 랭킹전 대기

imname1am 2024. 8. 7. 21:50
반응형

📖 문제

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

 

 

 

💡  풀이 방식

• 구현, 시뮬레이션

필요 자료구조
- 플레이어 레벨, 이름, 방에 들어갔는지 여부 저장하는 Player 객체
- 플레이어 정보 저장용 배열

 

 

. p개의 플레이어 정보를 입력받을 Player 배열을 생성한다.

. p개의 플레이어 정보를 입력받는다.

. 현재 i번째 플레이어가 이미 방에 배치된 플레이어가 아니고, 레벨 차이가 10 이하라면, 방에 추가한다.

. 이름 순으로 정렬한 후 출려갛기 위해 플레이어 이름으로 정렬한다.

. 방의 정원이 모두 찬 경우, 게임을 시작한다. / 그게 아니라면 대기를 출력한다.

. 현재 i번쨰 방에 있는 플레이어 정보를 모두 출력한다.

 

 

🔺 코드

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
import java.io.*;
import java.util.*;
 
public class Main {
    public static class Player implements Comparable<Player> {
        int level;
        String name;
        boolean check;  // 플레이어가 방 참가 여부
        
        Player(int level, String name) {
            this.level = level;
            this.name = name;
        }
        
        // 닉네임이 사전 순으로 앞서는 플레이어부터 출력
        @Override
        public int compareTo(Player p1) {
            return name.compareTo(p1.name);
        }
    }
    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();
        
        int p = Integer.parseInt(st.nextToken());   // 플레이어 수
        int m = Integer.parseInt(st.nextToken());   // 방 정원
        
        Player[] players = new Player[p];
        
        for (int i = 0 ; i < p ; i++) {
            st = new StringTokenizer(br.readLine());
            int level = Integer.parseInt(st.nextToken());
            String name = st.nextToken();
            players[i] = new Player(level, name);
        }
        
        for (int i = 0 ; i < p ; i++) {
            ArrayList<Player> room = new ArrayList<>();
            
            // 이미 방에 배치된 플레이어가 아니면 방에 추가
            if (!players[i].check) {
                for (int j = i ; j < p ; j++) {
                    // 방이 꽉 차면 종료
                    if (room.size() == m) {
                        break;
                    }
                    
                    int level = players[j].level;
                    String name = players[j].name;
                    
                    // 레벨 차이가 10 이하인 플레이어 방에 추가
                    if (!players[j].check && players[i].level - 10 <= level && players[i].level + 10 >= level) {
                        players[j].check = true;
                        room.add(new Player(level, name));
                    }
                }
                Collections.sort(room); // 플레이어 이름으로 정렬
                
                if (room.size() == m) { // 방의 정원이 모두 찬 경우 게임 시작
                    sb.append("Started!").append("\n");
                }
                else {
                    sb.append("Waiting!").append("\n");
                }
                
                // 방에 있는 플레이어 정보 출력
                for (Player player : room) {
                    sb.append(player.level).append(" ").append(player.name).append("\n");
                }
            }
        }
        
        System.out.println(sb);
    }
}
cs

 

 

 

➕ 다른 풀이 방식

- 방과 플레이어 정보 저장용 클래스를 2개 생성하고, 덱을 사용하셨다.

 

[백준] 20006: 랭킹전 대기열 (자바)

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

velog.io


💦 어려웠던 점

- 어떤 자료구조를 이용해 값들을 저장하고 활용하지 고민이 많이 되었다. (Map 쓸 생각도 했었다.)

 

 

🧐 새로 알게 된 내용

X

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

 

백준 20006 랭킹전 대기열(Java)

문제 출처 : https://www.acmicpc.net/problem/20006 20006번: 랭킹전 대기열 모든 생성된 방에 대해서 게임의 시작 유무와 방에 들어있는 플레이어들의 레벨과 아이디를 출력한다. 시작 유무와 플레이어의

jyunslog.tistory.com

 

반응형