백준 23826번 와이파이 Kotlin

: ) YOUNG·2024년 6월 17일
1

알고리즘

목록 보기
377/422
post-thumbnail

백준 23826번
https://www.acmicpc.net/problem/23826

문제



생각하기


  • 단순 계산, 완전 탐색 문제이다.


동작

0번 방이 공용 와이파이가 되는 방으로 문제에 따라 계산만 하면 된다.

먼저 sum값에 각 방에 도달하는 공용 와이파이의 세기 값을 계산한다.

그다음 sum값에 i번 방에 도달한 모든 핫스팟 세기의 합을 빼주면 된다.

그렇게 구해진 값 중 가장 큰 값 max가 정답이 된다.



결과


코드



Kotlin



import java.io.BufferedReader
import java.io.File
import java.util.StringTokenizer

// input
private var br = System.`in`.bufferedReader()

// variables
private var N = 0
private lateinit var arr: Array<Wifi>

private data class Wifi(var x: Int, var y: Int, var e: Int)

fun main() {
    val bw = System.out.bufferedWriter()

    input()

    bw.write(solve())
    bw.close()
} // End of main()

private fun solve(): String {
    val sb = StringBuilder()

    var max = 0
    for (i in 1..N) {
        // 각 방마다 0번방 공용와이파이가 도달하는 WIFI의 세기를 계산
        var sum = Math.max(0, calc(arr[0].x, arr[i].x, arr[0].y, arr[i].y, arr[0].e))

        for (j in 1..N) {
            // i번 방에 도달한 모든 핫스팟 WIFI의 세기 합을 뺀 값으로 계산한다.
            sum -= Math.max(0, calc(arr[i].x, arr[j].x, arr[i].y, arr[j].y, arr[j].e))
        }

        max = Math.max(max, sum)
    }

    if (max > 0) {
        sb.append(max)
    } else {
        sb.append("IMPOSSIBLE")
    }

    return sb.toString()
} // End of solve()

private fun calc(a: Int, c: Int, b: Int, d: Int, p: Int): Int {
    return Math.max(0, p - (Math.abs(a - c) + Math.abs(b - d)))
} // End of calc()

private fun input() {
    N = br.readLine().toInt()

    arr = Array<Wifi>(N + 1) {
        var st = StringTokenizer(br.readLine())
        Wifi(
            st.nextToken().toInt(),
            st.nextToken().toInt(),
            st.nextToken().toInt(),
        )
    }
} // End of input()

0개의 댓글