단순한 구현 문제
1. 플레이어 레벨과 아이디를 저장할 Map 2. 방 별 기준 레벨을 저장할 List 3. 방에 입장한 플레이어 아이디 저장할 List 총 세개를 사용했는데 과한가 싶다가도 실행 시간과 메모리는 크진 않아서 수정하진 않았다.
방이 새로 생길때는 room 리스트에 초기 레벨을 저장하고, player 리스트에 아이디를 저장해준다.
새 플레이어가 입장할 경우 초기 레벨과 10 이내로 차이나는 방이 있을 경우 입장시켜 주고, 없을 때는 새 방을 만들어준다.
마지막에 출력할 땐, 플레이어의 레벨과 아이디를 저장한 Map에서 아이디로 가져와서 출력해준다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
/**
* 백준 200006번 랭킹전 대기열
* - 구현
*/
public class Main {
public static void main(String[] args) throws IOException {
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()); // 방의 정원
Map<String, Integer> map = new HashMap<>(); // 플레이어 레벨과 아이디
List<Integer> room = new ArrayList<>(); // 방 별 기준 레벨
List<List<String>> player = new ArrayList<>(); // 방에 들어간 플레이어 아이디
for (int i = 0; i < p; i++) {
st = new StringTokenizer(br.readLine());
int level = Integer.parseInt(st.nextToken());
String id = st.nextToken();
map.put(id, level);
if (room.isEmpty()) {
room.add(level);
List<String> list = new ArrayList<>();
list.add(id);
player.add(list);
} else {
boolean enter = false;
for (int j = 0; j < room.size(); j++) {
if (room.get(j) + 10 >= level && room.get(j) - 10 <= level) {
if (player.get(j).size() < m) {
player.get(j).add(id);
enter = true;
break;
}
}
}
if (!enter) {
room.add(level);
List<String> list = new ArrayList<>();
list.add(id);
player.add(list);
}
}
}
for (int i = 0; i < room.size(); i++) {
if (player.get(i).size() == m) {
sb.append("Started!\n");
} else {
sb.append("Waiting!\n");
}
Collections.sort(player.get(i));
for (String s : player.get(i)) {
sb.append(map.get(s) + " " + s + "\n");
}
}
System.out.println(sb);
}
}