백준 [27172] kotlin

문제

https://www.acmicpc.net/problem/27172

풀이

그냥 단순하게 모든 플레이어 간의 대결을 모두 구하여 풀게 된다면 100000! 로 구할 수 없는 문제이다.

그렇다면, 다르게 풀어야 하는데 에라토스테네스의 체를 이용하여 해당 숫자의 배수를 카드 목록에 가지고있다면 , 결투를 하게 진행하면 된다. 

숫자가 담긴 카드 배열을 card라고 하고, 숫자를 가지고 있는지 확인하는 배열을 has라고 했을 때,

card[i] 부터 card[N]까지 배수를 찾아, 가지고 있는 카드인지 확인하여 점수를 계산해주면 된다.

 

코드

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter

private const val MAX_VALUE = 1000001
fun main() {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val bw = BufferedWriter(OutputStreamWriter(System.`out`))

    val N = br.readLine().toInt()
    val has = MutableList(MAX_VALUE){-1}
    val card = br.readLine().split(" ").map { it.toInt() } as MutableList
    val score = MutableList(N){0}
    card.forEachIndexed { idx, value ->
        has[value] = idx
    }

    repeat(N) {i ->
        // 에라토스테네스의 체
        for(j in card[i] * 2 until MAX_VALUE step(card[i])){
            // 가지고 있다면
            if(has[j] != -1) {
                score[i]++
                score[has[j]]--
            }
        }
    }
    val ans = score.joinToString(" ")
    bw.write(ans)
    bw.flush()
    bw.close()

}

'백준' 카테고리의 다른 글

백준 [12015] kotlin  (0) 2023.07.24
백준 [12100] kotlin  (0) 2023.07.19
백준 [2166] kotlin  (0) 2023.07.17
백준 - 자동으로 github에 백준 문제 커밋하기  (0) 2023.01.17
백준 [22333] kotlin  (0) 2023.01.10