링크 : https://www.acmicpc.net/problem/2805
2805번: 나무 자르기
첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보
www.acmicpc.net
높이의 최댓값을 구하는 이분탐색 문제입니다.
mid는 높이의 최댓값입니다. 따라서 tree를 돌면서 mid보다 큰 만큼 자릅니다.
총 자른 길이(count)가 집에 가져가야 하는 숫자(M)보다 많으면 start를 옮기고 정답을 업데이트합니다.
import Foundation
let arr = readLine()!.split(separator: " ").map { Int(String($0))! }
let N = arr[0]
let M = arr[1]
let tree = readLine()!.split(separator: " ").map { Int(String($0))! }.sorted()
var height = 0
var start = 0
var end = tree.max()! // 가장 긴 경우
while start <= end {
let mid = (start + end) / 2 // 높이의 최댓값
var count = 0
for t in tree {
if t > mid {
count += t - mid // tree를 돌면서 mid보다 큰 만큼 자릅니다.
}
}
if count >= M {
start = mid + 1
height = max(height, mid)
} else {
end = mid - 1
}
}
print(height)
'알고리즘' 카테고리의 다른 글
2022 SK ICT 1차 코딩테스트 후기 (0) | 2022.03.17 |
---|---|
[Swift] 백준 1654번 랜선 자르기 (0) | 2022.03.17 |
[Swift] 프로그래머스 - 카카오 길 찾기 게임 (0) | 2022.03.04 |
[Swift] 프로그래머스 - 카카오 캐시 (0) | 2022.02.28 |
[Swift] 프로그래머스 - 카카오 다트 게임 (0) | 2022.02.28 |
댓글