728x90
SMALL
백준 문제 풀이: 20006 [랭킹전 대기열]
문제 링크: https://www.acmicpc.net/problem/20006
문제 설명:
랭킹전 대기열을 관리하는 시스템을 구현하는 문제입니다. 플레이어는 자신의 레벨을 기준으로 방에 배정되며, 방이 꽉 차면 게임이 시작됩니다.
방은 다음 조건을 충족해야 합니다:
- 빈 방이 있다면 먼저 들어간다.
- 방이 꽉 차지 않았다면, 기존 방의 첫 번째 플레이어와 레벨 차이가 10 이하인 경우 같은 방에 들어갈 수 있다.
- 위 조건을 만족하지 못하면 새로운 방을 만든다.
문제 해결 코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<pair<int, string>> rooms[301]; // 대기방 리스트
// 닉네임을 기준으로 오름차순 정렬
bool compare(pair<int, string> a, pair<int, string> b) {
return a.second < b.second;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int p, m;
cin >> p >> m; // 플레이어 수, 최대 방 크기 입력
for (int i = 0; i < p; i++) {
int level;
string nickname;
cin >> level >> nickname;
// 적절한 방 찾기
for (int j = 0; j < p; j++) {
if (rooms[j].size() >= m) continue; // 방이 꽉 찼으면 건너뛴다.
if (rooms[j].empty()) { // 방이 비어있으면 새로운 방을 만든다.
rooms[j].push_back({ level, nickname });
break;
}
if (abs(rooms[j].front().first - level) > 10) continue; // 레벨 차이가 10 초과면 다른 방 찾기
rooms[j].push_back({ level, nickname });
break;
}
}
// 결과 출력
for (int i = 0; i < p; i++) {
if (rooms[i].size() == 0) break; // 비어있는 방이면 종료
if (rooms[i].size() == m) {
cout << "Started!" << '\n'; // 방이 꽉 찼다면 시작
} else {
cout << "Waiting!" << '\n'; // 대기 중
}
// 닉네임 기준 정렬 후 출력
sort(rooms[i].begin(), rooms[i].end(), compare);
for (int j = 0; j < rooms[i].size(); j++) {
cout << rooms[i][j].first << " " << rooms[i][j].second << '\n';
}
}
}
예제 입력:
6 2
10 a
15 b
20 c
25 d
30 e
35 f
예제 출력:
Started!
10 a
15 b
Started!
20 c
25 d
Started!
30 e
35 f
코드 설명
- 핵심 알고리즘: 벡터를 활용한 대기방 관리
- 구현 세부사항:
- 각 방은 벡터를 이용해 저장되며, 레벨이 비슷한 플레이어를 같은 방에 배치
- 닉네임을 기준으로 오름차순 정렬 후 출력
- 방이 최대 인원 수(
m
)에 도달하면 "Started!"를 출력 - 대기 중인 경우 "Waiting!"을 출력
- 시간 복잡도: O(P log P), 각 방 내의 정렬 연산 포함
결과
플레이어가 레벨 기준으로 방에 배정되고, 방이 꽉 차면 게임이 시작됩니다. 벡터를 활용한 대기열 관리 문제를 연습하기 좋은 문제입니다. 추가적인 질문이나 개선 사항이 있다면 댓글로 알려주세요!
728x90
LIST
'BAEKJOON > 구현' 카테고리의 다른 글
백준 32369번 [양파 실험](C++) -yes6686- 티스토리 (0) | 2025.03.30 |
---|---|
백준 3758번 [KCPC](C++) -yes6686- 티스토리 (1) | 2025.02.15 |
백준 13335번 [트럭](C++) -yes6686- 티스토리 (0) | 2025.02.12 |
백준 1515번 [수 이어 쓰기](C++) -yes6686- 티스토리 (0) | 2025.02.09 |
백준 1913번 [달팽이](C++) -yes6686- 티스토리 (0) | 2025.02.06 |