[이분 탐색] 백준 실버2 2805번: 나무 자르기(Swift)

2023. 5. 12. 20:37·코테

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

 

2805번: 나무 자르기

첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보

www.acmicpc.net

풀이과정

첫 시도는 주어진 나무 중 가장 높은 것을 기준으로 1씩 줄여가며 답을 탐색하였다.

역시, 시간 초과!!

런타임을 줄이기 위해선 탐색 횟수를 줄어야 한다.

때문에 하나씩 줄여가는 것이 아닌 중간 값을 탐색한다.

2번 예시에 따르면 가장 높은 나무는 46 절단기의 높이 최솟값은 0이므로

초기 max = 46 / min = 0

때문에 그에 중간값인 23을 탐색한다.

23으로 나무를 잘랐을 때 값이 M보다 작다면 max에 중간값을 대입하고,

크다면, min에 대입한다.

하지만, M보다 커도 높이가 최댓값이라면, 정답이기 때문에 클 경우엔 변수에 값을 담아 비교하여 최댓값을 찾아준다.

min + 1 == max 가 참이면 탐색을 끝낸다.

let input = readLine()!.split(separator: " ").map { Int($0)! }
let n = input[0]
let m = input[1]

let ts = readLine()!.split(separator: " ").map { Int($0)! }
var result = 0
var max = ts.max()!
var min = 0
var sum = 0

while true {
  let point = (max + min) % 2 == 0 ? (max + min)/2 : (max + min + 1)/2
  for t in ts {
    if t - point <= 0 { continue }
    sum += t - point
  }
  
  if sum == m {
    print(point)
    break
  }
  
  if sum < m {
    max = point
    sum = 0
  } else if sum > m {
    min = point
    sum = 0
    result = result < point ? point : result
  }
  
  if min + 1 == max {
    print(result)
    break
  }
}
저작자표시 (새창열림)

'코테' 카테고리의 다른 글

[구현 + 재귀] 백준 실버5 17478번: 재귀함수가 뭔가요?(Swift)  (0) 2023.05.15
[그리디] 백준 브론즈1 4796번: 캠핑(Swift)  (0) 2023.05.15
[완전 탐색] 백준 브론즈2 2231번: 분해합(Swift)  (0) 2023.05.12
[구현 + 시뮬레이션] 백준 2578번: 빙고  (0) 2023.05.08
[DFS] 백준 9466번: 텀 프로젝트(Swift)  (0) 2022.12.03
'코테' 카테고리의 다른 글
  • [구현 + 재귀] 백준 실버5 17478번: 재귀함수가 뭔가요?(Swift)
  • [그리디] 백준 브론즈1 4796번: 캠핑(Swift)
  • [완전 탐색] 백준 브론즈2 2231번: 분해합(Swift)
  • [구현 + 시뮬레이션] 백준 2578번: 빙고
Esiwon
Esiwon
iOS 개발 블로그
  • Esiwon
    시원한 코드 기록
    Esiwon
  • 전체
    오늘
    어제
    • 분류 전체보기 (70)
      • iOS&Swift (24)
      • git & github (1)
      • 코테 (41)
      • 네부캠 회고 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    Race Condition
    dfs
    BFS
    재귀
    동시성
    Combine
    GCD
    코딩테스트
    알고리즘
    노드
    비동기
    브루트포스 알고리즘
    회고
    PhotoKit
    챌린지
    백준
    이분탐색
    photoUI
    네부캠
    다이나믹 프로그래밍
    탐색
    photos
    코테
    완전탐색
    구현
    실버
    ios
    Swift
    Property wrapper
    그리디
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Esiwon
[이분 탐색] 백준 실버2 2805번: 나무 자르기(Swift)
상단으로

티스토리툴바