<Algorithm> 156. 점심식사시간(SWExpert)
by BFine반응형
1. 점심식사시간(SWExpert)
사용 알고리즘 : 비트마스크. 완전탐색
-
이거 푸는데 반나절이 걸린 것 같다... 오래 걸린이유가 문제를 잘못이해한데다가 테케가 46개나 통과됬다.
예외 사항 찾으려고 손수 최솟값을 구하려고 했는데 정답이 나오지가 않았다.
그래서 예제를 다시해보니 계단이 꽉찾을때 앞사람이 이동 완료하는 시간 +1 아니라 동시에 출발이었다...
문제에 대한 접근&생각
- 계단이 2개, 사람 최대 10명, n<=20 -> 완전탐색!
- 어떤 사람이 어느 계단을 이용할지 판단 -> 비트마스크!
- 한계단에 사람 3명초과 동시이용 불가 -> 결과조건
내 코드
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.PriorityQueue; import java.util.Queue; import java.util.Scanner; public class Solution { static int n; static List<Pair> plist; static List<Pair> slist; static int[] time = new int[2]; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int T = sc.nextInt(); for(int t = 1; t <= T; t++) { /****************************** * 비트마스크를 통해 모든 경우에 대해 * 완전탐색한다. 이때 Queue를 이용해서 * 최대 3명이 될때 다음 들어오는 사람과 * 처음 사람을 비교해서 뒷사람의 내려오는 * 시간을 구한다. *******************************/ n = sc.nextInt(); plist = new ArrayList<>(); slist = new ArrayList<>(); int cnt = 0; for(int i = 0 ; i < n; i++) { for(int j = 0; j < n; j++) { int element = sc.nextInt(); if(element == 1) { plist.add(new Pair(i, j)); }else if(element > 1) { time[cnt++] = element; slist.add(new Pair(i, j)); } } } res = Integer.MAX_VALUE; solve(); System.out.println("#"+t+" "+res); } } public static void solve() { for(int i = 0; i < 1<<plist.size(); i++) { step(i); } } public static void step(int bit) { //System.out.println(bit); PriorityQueue<Integer> pq1= new PriorityQueue<>(Integer::compareTo); PriorityQueue<Integer> pq2 = new PriorityQueue<>(Integer::compareTo); Pair step1 = slist.get(0); Pair step2 = slist.get(1); for(int i = 1,u=0; i < 1<<plist.size(); i= i<<1,u++) { //System.out.println(u); int d = 0; Pair person = plist.get(u); if((bit & i) == i) { d = Math.abs(step1.x-person.x)+Math.abs(step1.y - person.y); pq1.add(d+1); //System.out.println(step1.toString()+" "+person.toString()+" "+d); }else { d = Math.abs(step2.x-person.x)+Math.abs(step2.y - person.y); pq2.add(d+1); //System.out.println(step2.toString()+" "+person.toString()+" "+d); } } calc(pq1, pq2); } static int res; public static void calc(PriorityQueue<Integer> pq1,PriorityQueue<Integer> pq2) { Queue<Integer> queue1 = new LinkedList<>(); Queue<Integer> queue2 = new LinkedList<>(); if(!pq1.isEmpty()) queue1.add(pq1.poll()); if(!pq2.isEmpty()) queue2.add(pq2.poll()); while (!pq1.isEmpty()) { if(queue1.size() == 3) { int t = queue1.poll(); int wait = pq1.poll(); if((t+time[0])<wait) { queue1.add(wait); }else { queue1.add(t+time[0]); } }else { queue1.add(pq1.poll()); } } while (!pq2.isEmpty()) { if(queue2.size() == 3) { int t = queue2.poll(); int wait = pq2.poll(); if((t+time[1])<wait) { queue2.add(wait); }else { queue2.add(t+time[1]); } }else { queue2.add(pq2.poll()); } } int t1=0,t2=0; while(!queue1.isEmpty()) { t1 = queue1.poll(); } while(!queue2.isEmpty()){ t2 = queue2.poll(); } t1 += time[0]; t2 += time[1]; res = Math.min(res, Math.max(t1, t2)); } static class Pair{ @Override public String toString() { return "Pair [x=" + x + ", y=" + y + "]"; } int x,y; public Pair(int x, int y) { this.x = x; this.y = y; } } } | cs |
얻은 것
테케가 거의 다 통과해도 로직이 틀린 것 일 수도 있다.
참고 & 출처
반응형
'공부(2018~2019) - 스킨변경전 > Algorithm' 카테고리의 다른 글
<Algorithm> 158. 요리사(SWExpert) (0) | 2019.04.05 |
---|---|
<Algorithm> 157. 등산로(SWExpert) (0) | 2019.04.05 |
<Algorithm> 155. 탈주범검거(SWExpert) (0) | 2019.04.04 |
<Algorithm> 154. 디저트카페(SWExpert) (0) | 2019.04.03 |
<Algorithm> 153. 홈 방범 서비스(SWExpert) (0) | 2019.04.03 |
블로그의 정보
57개월 BackEnd
BFine