백준 23826번
https://www.acmicpc.net/problem/23826
0번 방이 공용 와이파이가 되는 방으로 문제에 따라 계산만 하면 된다.
먼저 sum
값에 각 방에 도달하는 공용 와이파이의 세기 값을 계산한다.
그다음 sum
값에 i
번 방에 도달한 모든 핫스팟 세기의 합을 빼주면 된다.
그렇게 구해진 값 중 가장 큰 값 max
가 정답이 된다.
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()