CodingTest/Baekjoon

[baekjoon] 백준 20006번(코틀린): 랭킹전 대기열

JunJangE 2022. 8. 19. 14:37

문제

 

20006번: 랭킹전 대기열

모든 생성된 방에 대해서 게임의 시작 유무와 방에 들어있는 플레이어들의 레벨과 아이디를 출력한다. 시작 유무와 플레이어의 정보들은 줄 바꿈으로 구분되며 레벨과 아이디는 한 줄에서 공백

www.acmicpc.net

알고리즘

- 반복문을 통해 플레이어를 입력받아 방에 넣어준다.

- 각 방을 돌면서 조건에 합당하면 넣어준다.

- 못 들어간 플레이어가 있다면 새로운 방을 만들어 넣어준다.

- 이름 기준으로 정렬 후 출력한다.

코드

package beakjoon.implementation

import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*
import kotlin.math.abs


fun main() {

    val rooms: MutableList<Room> = ArrayList()
    val br = BufferedReader(InputStreamReader(System.`in`))
    val pmInfo = br.readLine().split(" ")
    val p = pmInfo[0].toInt()
    val m = pmInfo[1].toInt()

    for (i in 0 until p) {
        //레벨 l
        //닉네임 n
        val playerInfo = br.readLine().split(" ")
        val l = playerInfo[0].toInt()
        val nickname = playerInfo[1]
        var hasRoom = false
        for (room in rooms) {

            // 현재 방에 기준이 되는 레벨보다 크거나 작다면
            if (!room.isValidLevel(l)) continue
            // 이미 방이 찼다면
            if (room.isFull) continue

            // 방에 멤버 ++
            room.member++

            // 방에 멤버가 꽉 찼다면
            if (room.member == m) {
                room.isFull = true // 방이 꽉 참.
            }

            // 밤에 멤버 정보를 추가
            room.peoples.add(Pair(nickname, l))
            hasRoom = true // 멤버가 들어감
            break
        }

        // 방에 멤버가 들어가지 못했다면 새로운 방을 만들고 그 방에 현재 멤버를 추가
        if (!hasRoom) {
            val newRoom = Room(l, m)
            newRoom.peoples.add(Pair(nickname, l))
            rooms.add(newRoom)
        }
    }


    val sb = StringBuilder()
    for (room in rooms) {

        // 닉네임 기준으로 정렬
        room.peoples.sortWith(compareBy<Pair> { it.nickname})

        if (room.isFull) {
            sb.append("Started!\n")
        } else {
            sb.append("Waiting!\n")
        }
        for (person in room.peoples) {
            sb.append(person.level).append(" ").append(person.nickname).append("\n")
        }
    }
    println(sb)
}

     class Pair(var nickname: String, var level: Int)

     class Room(level: Int, maxv: Int) {
        var isFull: Boolean
        var member: Int
        var level: Int
        var peoples: MutableList<Pair>

        init {
            isFull = maxv == 1
            member = 1
            this.level = level
            peoples = ArrayList()
        }

        fun isValidLevel(level: Int): Boolean {
            val result = abs(this.level - level)
            return result <= 10
        }
    }

github