개발자이야기
카카오 알고리즘 테스트 호텔방 배정 본문
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 | public static long[] solution(long k, long[] room_number) { long[] answer = new long[room_number.length]; long index = 0; for(long item : room_number) { long d = recu(item); answer[Math.toIntExact(index)] = d; index = index+1; } return answer; } static long recu(long me) { if(!hs.containsKey(me)) { hs.put(me, me+1); return me; } else { long d = recu(hs.get(me)); hs.put(me, hs.get(d)); return d; } } 위의 소스를 순차적으로 써보면 1번째 손님이 원하는 방인 1번 방은 재귀 함수로 진입하여 map key가 존재하지 않기때문에 key:1 val:2 로 저장한다 2번째 손님이 원하는 방도 마찬가지 key:3 val:4 3번째 손님이 원하는 방도 마찬가지 key:4 val:5 4번째 손님부턴 이미 방이 품절되었다. 내가 원하는 방보단 커야한다. 4번째 손님이 원하는 방인 1번방 재귀 함수로 진입한다 static long recu(long me) { <- 1진입 if(!hs.containsKey(me)) { <- 이미 1번 키는 배정되어있다 hs.put(me, me+1); return me; } else { long d = recu(hs.get(me)); <- hs.get(1) 원하는방 1 Key를 입력하여 value를 뽑는다 val:2 가 들어있다 재귀함수 재진입 hs.put(me, hs.get(d)); return d; } } static long recu(long me) { <- 2진입 if(!hs.containsKey(me)) { <- 2번키는 배정되지 않았다 hs.put(me, me+1); <-key:2 val:3 저장 return me; } else { long d = recu(hs.get(me)); hs.put(me, hs.get(d)); return d; } } 5번째 손님도 원하는 3번방은 이미 품절된 상태다 static long recu(long me) { <- 3진입 if(!hs.containsKey(me)) { <- 이미 3번 키는 배정되어있다 hs.put(me, me+1); return me; } else { long d = recu(hs.get(me)); <- hs.get(3) 원하는방 3 Key를 입력하여 value를 뽑는다 val:4 가 들어있다 재귀함수 재진입 hs.put(me, hs.get(d)); <- 아래의 5번방에서 리턴 받은 5 값을 map에서 얻어와서 key가 3인 value도 5로 바꿔준다 return d; } } static long recu(long me) { <- 4진입 if(!hs.containsKey(me)) { <- 이미 4번 키는 배정되어있다 hs.put(me, me+1); return me; } else { long d = recu(hs.get(me)); <- hs.get(4) 원하는방 4 Key를 입력하여 value를 뽑는다 val:5 가 들어있다 재귀함수 재진입 hs.put(me, hs.get(d)); <- 아래의 5번방에서 리턴 받은 5 값을 map에서 얻어와서 key가 4인 value도 5로 바꿔준다 return d; } } static long recu(long me) { <- 5진입 if(!hs.containsKey(me)) { <- 5번방은 배정되지 않았다. hs.put(me, me+1); return me; <- 5값을 return 하여 위의 4번방을 원했던 함수로 돌아간다. } else { long d = recu(hs.get(me)); hs.put(me, hs.get(d)); return d; } } 위를 반복한다. | cs |
'알고리즘' 카테고리의 다른 글
프로그래머스 가장 먼 노드 (0) | 2021.09.05 |
---|---|
프로그래머스 입국심사 (0) | 2021.09.03 |
이분탐색 java (0) | 2020.07.21 |