문제

코드
fun main() {
val (h, w, n, m) = readln().split(' ').map { it.toLong() }
val height = (h + n) / (n + 1)
val width = (w + m) / (m + 1)
println(width * height)
}
풀이
표를 그려서 자리를 채워보다가 대략적인 방향을 잡았다.
문제에서는 가로 m칸 또는 세로 n칸 이라고 적혀있어서 이것이 문제의 요점인가 싶었다.
근데 결국 가로 m칸 그리고 세로 n칸 으로 계산하는 것이 최대 수용 인원 수를 구하는 방법이다.

이런 식으로 대각선에 인원을 배치할 수 없기 때문이다

만약 h, w, n, m = 3, 3, 1, 1 라고 가정했을 때, (2, 3)에 인원을 배치시키는 것은 비효율적이기 때문에 가로 줄에서 최대 인원 수 * 세로 줄의 최대 인원 수 를 계산하면 된다고 생각했다.
가로, 세로의 최대 인원 수를 구하는 방법
가로를 예를 들어보자
k = w/(m+1)
w%(m+1) > 0 를 만족하면 k를 1 증가
세로도 w를 h로, m을 n으로 변경하면 식은 동일하다.
이렇게 나온 k 값을 곱하면 된다
이걸 기반으로 코드를 작성해봤다.
// 틀린 코드 입니다
fun main() {
val (h, w, n, m) = readln().split(' ').map { it.toInt() }
var width = w / (n + 1)
if (w % (n + 1) > 0) width++
var height = h / (m + 1)
if (h % (n + 1) > 0) height++
println(width * height)
}
코드를 더 간결하게 줄일 수 있을 것 같았다.
나머지가 조금이라도 남아있으면 몫을 그냥 1 증가하는 것은 결국 올림과 같은 의미다
그래서 아래와 같이 수정했다.
// 틀린 코드 입니다
fun main() {
val (h, w, n, m) = readln().split(' ').map { it.toInt() }
val width = (w + n) / (n + 1)
val height = (h + m) / (m + 1)
println(width * height)
}
이렇게 처음 제출했을 때, 틀렸다고 나왔다.
그래서 int 범위가 문제가 있나 했다.
h, w가 최대 50000까지 될 수 있었기 때문에, 혹시 몰라서 Long형으로 변경했다.
근데 이렇게 해도 틀렸다고 나오길래 코드를 보니, 가로에 w, m을 사용하고, 세로에 h, n을 사용해야했다
반대로 작성해놔서 문제가 됐던 것,,ㅎㅎ
정답 코드는 풀이 단락 위의 코드를 참고하세요~
+) Long형이 아니여도 제대로 동작합니다 참고하세요~
'Algorithm > 📖Baekjoon' 카테고리의 다른 글
#2292 벌집 (0) | 2024.07.22 |
---|---|
#5073 삼각형과 세 변 (1) | 2024.07.22 |
#1655 가운데를 말해요 (0) | 2024.07.20 |
#12865 평범한 배낭 (0) | 2024.07.19 |
#9465 스티커 (0) | 2022.08.14 |
댓글