문제
[프로그래머스] 입국심사
https://school.programmers.co.kr/learn/courses/30/lessons/43238
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
코드
#include <vector>
#include <algorithm>
using namespace std;
long long solution(int n, vector<int> times) {
sort(times.begin(), times.end());
long long answer = 0;
long long left = 1;
long long right = n * (long long)times.back();
while (left <= right) {
long long mid = (left + right) / 2;
long long passed = 0;
for (int i = 0; i < times.size(); i++) {
passed += (mid / (long long)times[i]);
}
if (passed >= n) {
answer = mid;
right = mid - 1;
} else
left = mid + 1;
}
return answer;
}
ㄴ예제의 테스트 케이스가 매개변수로 주어졌을 때 이진탐색 과정
풀이 - 이진 탐색
1. 초기 설정
심사에 필요한 최소 시간을 구하기 위해, left
는 최소 시간인 1로, right
는 모든 사람이 가장 오래 걸리는 심사관에게 심사를 받을 경우의 최대 시간으로 설정한다. 즉, right = n * times.back()
이다.
2. 중간 값 계산
mid = (left + right) / 2
를 계산하여 해당 시간(mid
) 안에 n
명을 처리할 수 있는지 확인한다.
3. 시간 내 처리 가능한 사람 수 계산
- 각 심사관이
mid
시간 내에 처리할 수 있는 사람 수를 합산하여passed
에 저장한다. for (int i = 0; i < times.size(); i++) { passed += (mid / (long long)times[i]); }
4. 조건에 따른 탐색 범위 조정
passed >= n
인 경우:mid
시간 내에n
명 이상을 처리할 수 있으므로 가능한 최소 시간을 줄여나가기 위해answer = mid
로 저장하고,right = mid - 1
로right
값을 줄인다.passed < n
인 경우:mid
시간 내에n
명을 처리할 수 없으므로 시간을 더 늘려야 합니다. 따라서left = mid + 1
로left
를 증가시킨다.
이 과정을 통해 심사에 필요한 최소 시간을 answer
에 저장하게 되며, 최종적으로 answer
를 반환하여 문제를 해결한다.
C++에서 타입 캐스팅(형 변환)의 중요성
C++는 다양한 자료형을 지원하는 언어로, 연산 시 두 자료형의 크기가 다를 경우 암묵적 형변환(implicit casting)이 발생할 수 있다. 하지만 이 과정에서 정확한 결과를 얻지 못할 가능성이 생기기 때문에 명시적 형변환(explicit casting)이 중요하게 사용된다.
위 코드에서 사용된 타입 캐스팅을 예로 들면,
long long right = n * (long long)times.back()
에서 타입 캐스팅을 하지 않을 시 n
과 times.back()
값이 매우 크다면 두 값을 곱할 때 정수 오버플로우가 발생할 수 있다. 즉, int
타입의 범위를 초과하여 예상치 못한 값이 될 수 있다.
마찬가지로 passed += (mid / (long long)times[i])
에도 타입 캐스팅을 하지 않는다면 연산 과정에서 문제가 발생할 수 있다.
이런 경우 명시적으로 피연산자를 long long
으로 변환해 주면, 연산 자체가 long long
으로 처리되므로 오버플로우를 방지할 수 있다.
'99클럽 TIL' 카테고리의 다른 글
99클럽 코테 스터디 6일차 TIL + 이진탐색(C++) (0) | 2024.11.02 |
---|---|
99클럽 코테 스터디 5일차 TIL + BFS(C++) (0) | 2024.11.02 |
99클럽 코테 스터디 4일차 TIL + DFS(C++) (0) | 2024.10.31 |
99클럽 코테 스터디 2일차 TIL + 이진탐색(C++) (0) | 2024.10.29 |
99클럽 코테 스터디 1일차 TIL + 이진탐색(C++) (0) | 2024.10.28 |