땅지원
땅지원's Personal blog
땅지원
전체 방문자
오늘
어제
  • 전체 (353)
    • Frontend (2)
      • React (2)
    • Backend (90)
      • Java (16)
      • Python (19)
      • Spring (23)
      • Database (21)
      • Troubleshooting (8)
    • DevOps (27)
      • ELK (13)
    • CS (40)
    • OS (2)
      • Linux (2)
    • Algorithm (95)
      • concept (18)
      • Algorithm Problem (77)
    • 인공지능 (25)
      • 인공지능 (12)
      • 연구노트 (13)
    • 수업정리 (35)
      • 임베디드 시스템 (10)
      • 데이터통신 (17)
      • Linux (8)
    • 한국정보통신학회 (5)
      • 학술대회 (4)
      • 논문지 (1)
    • 수상기록 (8)
      • 수상기록 (6)
      • 특허 (2)
    • 삼성 청년 SW 아카데미 (6)
    • 42seoul (12)
    • Toy project (3)
    • 땅's 낙서장 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 20.11.6 BB21플러스 온라인 학술대회
  • 20.10.30 한국정보통신학회 온라인 학술대회

인기 글

태그

  • ㅗ
  • E
  • D
  • 이것이 리눅스다 with Rocky Linux9
  • I

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
땅지원

땅지원's Personal blog

Algorithm/Algorithm Problem

백준 3079 입국심사(이분탐색)

2022. 7. 10. 15:25

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

 

3079번: 입국심사

첫째 줄에 N과 M이 주어진다. (1 ≤ N ≤ 100,000, 1 ≤ M ≤ 1,000,000,000) 다음 N개 줄에는 각 심사대에서 심사를 하는데 걸리는 시간인 Tk가 주어진다. (1 ≤ Tk ≤ 109)

www.acmicpc.net

문제의 범위를 보고 이분탐색이라고 생각을 먼저 했다.

하지만 어떤값을 탐색할지에 대해 고민이 많았는데 결과적으로 우리가 구하려는 총 시간에 대해서 탐색한다.

일단 start, end값을 정해야하는데 0이나 1이라고 두고 end는 min(time) * m이 된다.

why?)

time에서 가장 작은 값의 입국심사대에 m명 모두 그 심사대만 이용가능한 경우이므로 min(time)*m 이 된다.

 

우리가 탐색하는 기준 : m명 모두 입국심사에 통과할 수 있는 최소의 시간

똑같이 이분탐색의 mid값을 정한다음에 그 값에 대해서 모든 입국심사대의 Tk로 나눠준다.

why?)

지금 mid값은 m명이 모두 통과할 수 있는 시간인데 각 입국심사대로 부터 mid // Tk로 나누게 되면

mid시간 동안 그 입국심사대에서 통과할 수 있는 인원의 수를 구할 수 있다.

 

이런식으로 모든 입국심사대에서 통과시킬 수 있는 모든 인원의 수를 더한다음 if temp < m이 되면 start를 증가시키고 if temp >= m이면 m명을 모두 통과 할 수 있다는 뜻이니까 end를 줄여나간다.

why?)

우리는 최소의 time을 구하는 것이기 때문에 end를 최대한 줄여나가서 start >= end가 되는 지점까지 찾아야한다. 그리고 time이 sorted가 되어있기 때문에 if temp >= m:에서 res값을 전의 res값과 비교해줄 필요 x

import sys
input = sys.stdin.readline

N, M = map(int, input().split())
time = sorted(list(int(input()) for _ in range(N)))

start = 0
end = min(time) * M
result = 0

while start <= end :
    mid = (start + end) // 2
    temp = 0
    for t in time:
        temp += mid // t

    if temp >= M:
        end = mid - 1
        result = mid #sorted했기 때문에 min()해줄 필요 x
    else:
        start = mid + 1
    #print(start,end)
print(result)

 

'Algorithm > Algorithm Problem' 카테고리의 다른 글

백준 16206 롤케이크(그리디)  (0) 2022.07.12
백준 1068 트리(DFS)  (0) 2022.07.10
백준 2251 물통(BFS)  (0) 2022.07.03
백준 6236 용돈 관리(이분 탐색)  (0) 2022.07.03
백준 10451 순열 사이클(DFS, Union-Find)  (2) 2022.06.27
    'Algorithm/Algorithm Problem' 카테고리의 다른 글
    • 백준 16206 롤케이크(그리디)
    • 백준 1068 트리(DFS)
    • 백준 2251 물통(BFS)
    • 백준 6236 용돈 관리(이분 탐색)
    땅지원
    땅지원
    신입 개발자의 우당탕탕 기술 블로그

    티스토리툴바