Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
Tags
- 백준
- react
- Laravel
- Flutter
- 개발자 취업
- 플러터
- C++
- 오블완
- Python
- ML
- 파이썬
- 뷰
- 티스토리챌린지
- c++ 코테
- vue
- 코테 파이썬
- DP
- 99클럽
- 파이썬 코테
- 코딩테스트 준비
- 코딩테스트준비
- flutter getx
- 코딩테스트
- 알고리즘
- til
- 라라벨
- 안드로이드
- 개발자취업
- 코테
- 항해99
Archives
- Today
- Total
잡다로그
[Python/코테] 프로그래머스 입국심사 본문
프로그래머스 입국심사
문제: https://school.programmers.co.kr/learn/courses/30/lessons/43238
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr

알고리즘 설계
💡idea.
제한 사항을 확인해보면 기다리는 사람, 걸리는 시간 등의 최대값이 꽤 큰 것을 확인할 수 있다. 반복문을 잘못 사용하면 쉽게 시간초과가 발생한다.
각 사람에 대해 어떤 심사대에서 심사를 받을지를 결정하는 대신, 특정 시간 내에 모든 사람이 심사를 받을 수 있는지를 판단하는 방식으로 접근할 수 있다. 즉 시간을 기준으로 가능한 사람 수를 계산한다.
조건을 만족하는 최소 시간을 찾기 위해, 이진 탐색을 활용할 수 있다.
🎲step.
1. 각 심사관이 기준 시간동안 처리할 수 있는 사람 수를 계산한다.
2. n명보다 많거나 적다면 기준 시간을 줄이거나늘리면서 다시 1번 검사를 반복한다.
알고리즘 구현
def solution(n, times):
# 최소 시간
left = 1
# 최대 시간
right = max(times) * n
while left < right:
mid = (left + right) // 2
# mid 시간 내에 처리할 수 있는 총 사람 수 계산
total = sum(mid // time for time in times)
# 총 처리할 수 있는 사람 수가 n 이상이면, 시간을 줄여도 될 가능성
if total >= n:
right = mid
else:
# 그렇지 않으면, 더 많은 시간이 필요
left = mid + 1
return left
출처: chatgpt
문제 예시에도 나왔듯, 누군가는 더 짧은 심사대를 이용하기 위해 기다렸다가 심사를 받는 경우도 있다. 이 경우는 mid시간으로 심사 시간을 나눴을 때의 나머지가 될 것이다.
즉 아래와 같이 반복되며 최적의 mid를 구할 수 있다.
- mid = (left + right) // 2 = (24 + 30) // 2 = 27
- 각 심사관이 27분 동안 처리할 수 있는 사람 수:
- 첫 번째 심사관: 27 // 7 = 3명
- 두 번째 심사관: 27 // 10 = 2명
- 총 처리할 수 있는 사람 수: 3 + 2 = 5명
- total < n이므로, left = mid + 1 = 28
- mid = (left + right) // 2 = (28 + 30) // 2 = 29
- 각 심사관이 29분 동안 처리할 수 있는 사람 수:
- 첫 번째 심사관: 29 // 7 = 4명
- 두 번째 심사관: 29 // 10 = 2명
- 총 처리할 수 있는 사람 수: 4 + 2 = 6명
- total >= n이므로, right = mid = 29
나다어
나는 다음에 어떻게 풀까
- 이 문제에서는 특정 시간 내에 모든 사람이 심사를 받을 수 있는지를 판단하는 방식으로 접근할 수 있다고 했다. 출력해야 하는 값이 '걸리는 시간' 이므로, 출력해야 하는 값을 기준으로 문제 해결의 힌트를 얻을 수 있을 것 같다.
- --> 너무 복잡하면 정반대로 생각해보자 !
- 이진탐색은 정렬된 배열에서 값을 찾을 때 뿐만 아니라, 조건을 만족하는 최적/최대최소(경계) 값을 찾을 때 효율적이다. 즉 특정 조건을 만족하는 값을 찾는 문제에서 많이 쓰인다.
'Algorithm' 카테고리의 다른 글
| [99클럽 코테 스터디] 20일차 TIL - 문자열, Decode the Message (0) | 2024.06.19 |
|---|---|
| [99클럽 코테 스터디] 19일차 TIL - 문자열, Shuffle String (0) | 2024.06.18 |
| [99클럽 코테 스터디] 18일차 TIL - 문자, Iterator for Combination (0) | 2024.06.18 |
| [99클럽 코테 스터디] 17일차 TIL - 배열, Group the People Given the Group Size They Belong To (0) | 2024.06.17 |
| [Python/코테] LeetCode 2433. Find The Original Array of Prefix Xor (0) | 2024.06.15 |
Comments