[백준] 20006: 랭킹전 대기열 - JAVA
https://www.acmicpc.net/problem/20006
풀이
플레이어의 레벨과 닉네임이 주어진다.
플레이어를 방에 적절하게 배치시켜야 하는데
생성된 방이 없거나 들어갈 방이 없다면 해당 플레이어의 레벨을 기준으로 방을 생성하고,
생성된 방 중에 해당 방의 레벨을 기준으로 -10부터 +10 사이에 플레이어의 레벨이 있다면 방에 입장시킨다.
방의 정원이 꽉 찼으면 더이상 들어갈 수 없다.
Node라는 클래스를 만들어 처음 선언될 때 해당 플레이어의 레벨로 초기화해주었고
닉네임 사전순으로 출력하기 위해 TreeMap에 넣어주었다.
메모리: 16396KB
시간: 172ms
언어: Java 11
코드
import java.util.*;
import java.io.*;
public class Main {
static class Node {
int level;
TreeMap<String, Integer> map;
public Node(int level) {
this.level = level;
map = new TreeMap<>();
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int p = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
ArrayList<Node> list = new ArrayList<>();
for (int i = 0; i < p; i++) {
st = new StringTokenizer(br.readLine());
int level = Integer.parseInt(st.nextToken());
String name = st.nextToken();
boolean flag = false;
for (Node node : list) {
if (node.map.size() == m) {
continue;
}
if (Math.abs(node.level - level) <= 10) {
node.map.put(name, level);
flag = true;
break;
}
}
if (!flag) {
Node node = new Node(level);
node.map.put(name, level);
list.add(node);
}
}
StringBuilder sb = new StringBuilder();
for (Node node : list) {
if (node.map.size() < m) {
sb.append("Waiting!").append("\n");
} else {
sb.append("Started!").append("\n");
}
for (Map.Entry<String, Integer> entry : node.map.entrySet()) {
String name = entry.getKey();
int level = entry.getValue();
sb.append(level + " " + name).append("\n");
}
}
System.out.println(sb);
}
}