<Algorithm> 150. 줄기세포배양(SWExpert)
by BFine반응형
1. 줄기세포배양(SWExpert)
BFS, 정렬 문제
이문제를 풀면서 Integer.compare로 정렬 코드 짤때 코드를 간결하게 짤수 있다는 것을 배웠다..
처음에 접근할때 세포가 번식하면 죽는걸로 했는데 알고보니 생명력 만큼 살아있었다.. 이부분은 다른사람 코드를 보고 힌트를 얻었다.
Cell의 생명력의 두배만큼 해주면 최대 살수 있는 시간이 되므로 이를 활용하여 문제를 풀었다.
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 | import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; public class Solution { static int k; static int[][] map; static List<Pair> pq; public static void main(String[] args) { Scanner sc = new Scanner(System.in); /****************************** * BFS를 이용해서 Cell을 번식하고 * 정렬을 이용해서 더 생명력이 큰 Cell이 * 먼저 번식할 수 있도록 만든다. 그리고 * 살아남을 수 있는 세포들을 K초까지 구하고 * 이를 출력한다. *******************************/ int T = sc.nextInt(); for(int t = 1; t<=T; t++) { pq = new ArrayList<>(); map = new int[700][700]; int r = sc.nextInt(); int c = sc.nextInt(); k = sc.nextInt(); res = 0; for(int i = 0; i < r ; i++) { for(int j = 0; j < c; j++) { int size = sc.nextInt(); map[i+350][j+350] = size; if(size!=0) { pq.add(new Pair(i+350, j+350, size, size+1)); //세포를 큐에 담는다. time 라이프 주기 if(size*2>k) res++; // k초동안 살아남을 수 있는 세포 } } } Collections.sort(pq); bfs(); System.out.println("#"+t+" "+res); } } static int[] dx = {0,0,1,-1}; static int[] dy = {1,-1,0,0}; static int res; public static void bfs() { while (true) {// 번식 Pair cell = pq.remove(0); if (cell.time > k) break; for (int i = 0; i < 4; i++) { int nx = cell.x + dx[i]; int ny = cell.y + dy[i]; if (map[nx][ny] == 0) { pq.add(new Pair(nx, ny, cell.size, cell.time + cell.size + 1)); map[nx][ny] = cell.size; if(cell.time+cell.size*2>k) res++; } } Collections.sort(pq); } } static class Pair implements Comparable<Pair>{ int x,y,size,time; public Pair(int x, int y,int size, int time) { this.x = x; this.y = y; this.size = size; this.time = time; } @Override public int compareTo(Pair o2) { if(time != o2.time) return Integer.compare(time, o2.time); else return Integer.compare(o2.size, size); } } } | cs |
참고 & 출처
반응형
'공부(2018~2019) - 스킨변경전 > Algorithm' 카테고리의 다른 글
<Algorithm> 152. 벌꿀채취(SWExpert) (1) | 2019.04.03 |
---|---|
<Algorithm> 151. 수영장(SWExpert) (0) | 2019.04.02 |
<Algorithm> 149. 숫자만들기(SWExpert) (0) | 2019.04.01 |
<Algorithm> 148. 보물상자비밀번호(SWExpert) (0) | 2019.04.01 |
<Algorithm> 147. 욕심쟁이판다(BJO) (0) | 2019.03.30 |
블로그의 정보
57개월 BackEnd
BFine