반응형
난이도 : Medium
특징 : Priority Queue
요구사항
입출력 예시
Hackerrank invitation으로 온 문제라서.. 문제에대한 링크를 걸 수가 없다.
Sample Input 1
1. 첫 번째 줄에는 배열의 크기 값
2. 두 번째 줄 이후는 배열의 각 요소이다.
3. 마지막에서 2번째 줄은 만들어야하는 팀원의 수
4. 마지막 줄은 Manager가 팀원을 뽑기 위해서 배열에서 선택하는 그룹의 크기를 의미한다.
단순히 구현으로만 생각하면 생성하는 그룹마다, python의 max 내장 함수로 처리하면 되겠지만 어느정도 입력이 커지면 Timeout이 나버린다.
개인적으로 2가지 성능에 큰 영향을 미치는 부분은
1. Manager가 선택한 그룹에서 최댓값을 찾는 코드
2. 선택한 두 가지 그룹에서 최댓값이 오른쪽 그룹에 있을때, 이를 원래 배열에서 삭제하는 코드
라고 생각한다.
Hackerrank 테스트를 해볼 수가 없어서 확인은 못했지만, 각 그룹에서 max를 구하는 부분을 max heap 구조를 구현해서 첫 번째 인덱스를 리턴하는 방식으로 풀면 좋을 것 같다.
heapify 코드 / 출처 :https://smlee729.github.io/python/data%20structure/2015/03/04/1-heap.html
class Heap:
def __init__(self, arr):
self.queue = [None]
self.queue.extend(arr)
for i in range(int(len(self.queue)/2),0,-1):
self.max_heapify(i)
def max_heapify(self, i):
largest = i
left = i*2
right = i*2+1
if left <= len(self.queue)-1 and self.queue[largest] < self.queue[left]:
largest = left
if right <= len(self.queue)-1 and self.queue[largest] < self.queue[right]:
largest = right
if largest != i:
self.queue[i], self.queue[largest] = self.queue[largest], self.queue[i]
self.max_heapify(largest)
def print_all(self):
print('After heapify : {0} / 최댓값 : {1}'.format(self.queue, self.queue[1]))
def main():
tmp = [6, 18, 8]
print('Manager가 선택한 그룹1 : {0}'.format(tmp))
tmp = Heap(tmp)
tmp.print_all()
tmp = [12, 18, 9]
print('Manager가 선택한 그룹2 : {0}'.format(tmp))
tmp = Heap(tmp)
tmp.print_all()
결과
Manager가 선택한 그룹1 : [6, 18, 8]
After heapify : [None, 18, 6, 8] / 최댓값 : 18
Manager가 선택한 그룹2 : [12, 18, 9]
After heapify : [None, 18, 12, 9] / 최댓값 : 18
>>>
반응형
'프로그래밍 > 코딩 (PYTHON)' 카테고리의 다른 글
[140922] Python - 입력 받은 문자열 주석 제거하기 (0) | 2014.09.22 |
---|