코딩테스트/Java

[JAVA] 이분탐색(이진탐색) "입국심사", "징검다리"

SK_MOUSE 2020. 11. 24. 16:40
입국심사
징검다리

입국심사

 

실패코드(완전탐색방법)

class Solution { ​​​​class Tester{ ​​​​​​​​long startT, spendT; ​​​​​​​​Tester(long startTime, long spendingTime){ ​​​​​​​​​​​​startT = startTime; ​​​​​​​​​​​​spendT = spendingTime; ​​​​​​​​} ​​​​} ​​​​public long solution(int n, int[] times) { ​​​​​​​​long answer = 0; ​​​​​​​​long time =0; ​​​​​​​​PriorityQueue<Tester> q = new PriorityQueue<Tester>(//오름차순 정렬. ​​​​​​​​​​​​​​​​(o1,o2)-> (int)((o1.spendT+o1.startT) - (o2.spendT+o2.startT)) ​​​​​​​​); ​​​​​​​​for(long t : times) ​​​​​​​​​​​​q.offer(new Tester(0, t));//0초일때 모두 넣는다. ​​​​​​​​for(long i =0; i<n; i++){ ​​​​​​​​​​​​Tester completedTester = q.poll(); ​​​​​​​​​​​​time = completedTester.spendT + completedTester.startT; ​​​​​​​​​​​​//System.out.println(time); ​​​​​​​​​​​​q.offer(new Tester(time , completedTester.spendT));//새로운 Tester 추가 ​​​​​​​​} ​​​​​​​​return time; ​​​​} }

성공코드(이분탐색)

import java.util.Arrays; import java.util.LinkedList; import java.util.PriorityQueue; import java.util.Queue; class Solution { ​​​​public static long solution(int n, int[] times) { ​​​​​​​​long answer = 0; ​​​​​​​​//오름차순 정렬 ​​​​​​​​Arrays.sort(times); ​​​​​​​​//이분탐색을 위한 초기 범위 설정 ​​​​​​​​//처음에는 비어있는 심사관 수만큼은 바로 심사했다고 생각하고 최대 걸리는 시간 ​​​​​​​​int baseNum = Math.max((n - times.length), 1); ​​​​​​​​long front = 1; ​​​​​​​​long rear = (long) times[times.length-1] * baseNum; ​​​​​​​​answer = rear; ​​​​​​​​while (front <= rear){ ​​​​​​​​​​​​//기준 시간 ​​​​​​​​​​​​long mid = (front + rear) / 2; ​​​​​​​​​​​​System.out.println(mid); ​​​​​​​​​​​​//기준 시간보다 작다면 해당 심사 시간으로 가능한 심사개수 카운팅 ​​​​​​​​​​​​long count = countTime(mid, times); ​​​​​​​​ ​​​​​​​​​​​​if(count < n) front = mid+1; ​​​​​​​​​​​​else { ​​​​​​​​​​​​​​​​answer = Math.min(answer, mid); ​​​​​​​​​​​​​​​​rear = mid-1; ​​​​​​​​​​​​} ​​​​​​​​} ​​​​​​​​return answer; ​​​​} ​​​​private static long countTime(long mid, int[] times) { ​​​​​​​​long count = 0; ​​​​​​​​for(int i=0; i<times.length; ++i){ ​​​​​​​​​​​​count += (mid / times[i]); ​​​​​​​​} ​​​​​​​​return count; ​​​​} }

 

 

징검다리

import java.util.Arrays; class Solution { ​​​​public int solution(int distance, int[] rocks, int n) { ​​​​​​​​int answer = 0; ​​​​​​​​Arrays.sort(rocks); ​​​​​​​​int left = 0; ​​​​​​​​int right = distance; ​​​​​​​​int mid = 0; ​​​​​​​​while (left <= right) { ​​​​​​​​​​​​mid = (left + right) / 2; ​​​​​​​​​​​​int prv = 0; ​​​​​​​​​​​​int removeCnt = 0; ​​​​​​​​​​​​for (int i = 0; i < rocks.length; i++) { ​​​​​​​​​​​​​​​​if (rocks[i] - prv < mid) { ​​​​​​​​​​​​​​​​​​​​removeCnt++; ​​​​​​​​​​​​​​​​​​​​if (removeCnt > n) { ​​​​​​​​​​​​​​​​​​​​​​​​break; ​​​​​​​​​​​​​​​​​​​​} ​​​​​​​​​​​​​​​​} else { ​​​​​​​​​​​​​​​​​​​​prv = rocks[i]; ​​​​​​​​​​​​​​​​} ​​​​​​​​​​​​} ​​​​​​​​​​​​if (removeCnt > n) { ​​​​​​​​​​​​​​​​right = mid - 1; ​​​​​​​​​​​​} else { ​​​​​​​​​​​​​​​​answer = answer > mid ? answer : mid; ​​​​​​​​​​​​​​​​left = mid + 1; ​​​​​​​​​​​​} ​​​​​​​​} ​​​​​​​​return answer; ​​​​} }

in-intuition.tistory.com/21

 

[프로그래머스] 징검다리(Java) [이분탐색]

문제 설명 출발지점부터 distance만큼 떨어진 곳에 도착지점이 있습니다. 그리고 그사이에는 바위들이 놓여있습니다. 바위 중 몇 개를 제거하려고 합니다. 예를 들어, 도착지점이 25만큼 떨어져 있

in-intuition.tistory.com

 

반응형

'코딩테스트 > Java' 카테고리의 다른 글

[JAVA] 그래프 "순서"  (0) 2020.12.01
[JAVA] 그래프 "가장 먼 노드"  (1) 2020.11.26
[JAVA] DFS/BFS "여행경로"  (0) 2020.11.11
[JAVA] DFS/BFS "단어변환"  (0) 2020.11.11
[JAVA] DFS/BFS "네트워크"  (0) 2020.11.09