[이분 탐색] 백준 실버3 2512번: 예산(Swift)

2023. 5. 18. 21:47·코테

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

 

2512번: 예산

첫째 줄에는 지방의 수를 의미하는 정수 N이 주어진다. N은 3 이상 10,000 이하이다. 다음 줄에는 각 지방의 예산요청을 표현하는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 값들은 모두 1 이상

www.acmicpc.net

Code
let n = Int(readLine()!)!
var list = readLine()!.split(separator: " ").map { Int($0)! }.sorted(by: <)
let total = Int(readLine()!)!

var sum = 0

list.forEach {
  sum += $0
}

if sum <= total {
  print(list.max()!)
} else {
  var right = list[list.count - 1]
  var left = 1
  var result = 0
  
  while true {
    let med = (right + left) / 2
    var totalBudget = 0
    
    list.forEach {
      totalBudget += $0 <= med ? $0 : med
    }
    
    if totalBudget < total {
      left = med
      result = med
    } else if totalBudget > total {
      right = med
    } else {
      result = med
      break
    }
    
    if med + 1 == right {
      break
    }
  }
  print(result)
}
풀이과정

먼저, 문제를 정리해보면 

지방 요청 예산이 리스트로 주어지고, 총 국가예산이 주어진다.

지방 요청 예산의 합이 총 국가예산보다 작으면, 요청 예산대로 예산을 배분해주면 된다.

즉 출력값은 리스트의 최대값이 된다.

하지만, 요청 예산의 합이 국가예산보다 크다면, 상한액을 정해 요청 예산이 상한액보다 작은 지방은 요청대로 예산을 배정하고,

큰 지방은 상한액으로 예산을 배정한다.

때문에, 상한액을 이분 탐색을 통해 계산한다.

때문에 left엔 1을 right엔 list의 최대값을 담아 중간값(med)을 계산한다.

중간값을 이용하여 요청 예산이 중간값보다 작거나 같다면, 요청예산 그대로 아니라면 중간값을 더해 총 합을 계산한다.

해당 총합이 주어진 국가예산보다 크다면 right에 med를 담는다.

작으면 left에 med를 담고, result엔 상한액이 될 수 도 있는 med를 담아준다.

둘이 같다면, 더 이상 계산할 필요가 없으므로 result에 med값을 담고 반복분을 break 해준다.

 

저작자표시 (새창열림)

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

[분할정복 + 재귀] 백준 실버1 1629번: 곱셈(Swift)  (0) 2023.05.22
[그리디] 백준 실버4 11047번: 동전 0(Swift)  (0) 2023.05.19
[완전 탐색] 백준 브론즈1 10448번: 유레카 이론(Swift)  (0) 2023.05.18
[구현] 백준 실버5 20546번: 기적의 매매법(Swift)  (1) 2023.05.16
[BFS] 백준 실버1 2178번: 미로 탐색(Swift)  (0) 2023.05.16
'코테' 카테고리의 다른 글
  • [분할정복 + 재귀] 백준 실버1 1629번: 곱셈(Swift)
  • [그리디] 백준 실버4 11047번: 동전 0(Swift)
  • [완전 탐색] 백준 브론즈1 10448번: 유레카 이론(Swift)
  • [구현] 백준 실버5 20546번: 기적의 매매법(Swift)
Esiwon
Esiwon
iOS 개발 블로그
  • Esiwon
    시원한 코드 기록
    Esiwon
  • 전체
    오늘
    어제
    • 분류 전체보기 (70)
      • iOS&Swift (24)
      • git & github (1)
      • 코테 (41)
      • 네부캠 회고 (4)
  • 블로그 메뉴

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

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Esiwon
[이분 탐색] 백준 실버3 2512번: 예산(Swift)
상단으로

티스토리툴바