반응형
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
이분탐색을 이용해 푸는 문제였다.
기준 M을 두고 작으면 + 크면 - 하는 식이었는데 이분탐색을 이용해서 푸는 문제의 유형을 조금은 알 것 같다.
내 코드
메모리 : 57656 KB
시간 : 527 ms
코드길이 : 1585 B
[내 코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Solution {
static int N;
static int M;
static int[] time;
static long maxTime;
static int result;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
for(int t = 1; t <= T; t++) {
sb.append('#').append(t).append(' ');
st = new StringTokenizer(br.readLine());
//심사대개수
N = Integer.parseInt(st.nextToken());
//대기인원
M = Integer.parseInt(st.nextToken());
maxTime = 0;
time = new int[N];
//심사대 소요시간 입력
for(int n = 0; n < N; n++) {
time[n] = Integer.parseInt(br.readLine());
if(time[n] > maxTime)
maxTime = time[n];
}
//이분탐색으로 최소시간 찾기
sb.append(binarySearch(0, maxTime * M)).append('\n');
}
System.out.print(sb);
}
//소요시간 리턴
public static long binarySearch(long start, long end) {
//최소시간. 최악의 시간으로 초기화
long result = maxTime * M;
while(start <= end) {
long person = 0;
long mid = (start + end) / 2;
for(int i = 0; i < N; i++) {
person += mid / time[i];
}
//모자랄 때 --> 시간을 늘려야 함
if(person < M) {
start = mid + 1;
}
//초과할 때 --> 시간을 줄여야 함
else {
if(result > mid)
result = mid;
end = mid - 1;
}
}
return result;
}
}
반응형
'SSAFY > SWEA' 카테고리의 다른 글
[SWEA] 5215 : 햄버거 다이어트 (0) | 2023.04.30 |
---|---|
[SWEA] 1486 : 장훈이의 높은 선반 (0) | 2023.04.29 |
[SWEA] 1225 : 암호생성기 (0) | 2023.04.27 |
[SWEA] 1221 : GNS (0) | 2023.04.27 |
[SWEA] 1220 : Magnetic (0) | 2023.04.27 |