[Java] 백준 200006번: 랭킹전 대기열

U·2024년 10월 14일

백준

목록 보기
63/116

[문제 바로 가기] - 랭킹전 대기열

💡 접근 방식

단순한 구현 문제

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);
	}
}
profile
백엔드 개발자 연습생

0개의 댓글