이 글은 "파이썬 알고리즘 인터뷰 (박상길 지음)"을 읽고 주관적으로 요약한 글입니다.
문제 정의
(내 키, 앞에 줄 선 사람 중 내 키 이상인 사람)이 주어질 때 재정렬
책에서 구현된 코드
import heapq
from typing import List
class Solution:
def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
heap = []
# 키 역순, 인덱스 삽입
for person in people:
heapq.heappush(heap, (-person[0], person[1]))
result = []
# 키 역순, 인덱스 추출
while heap:
person = heapq.heappop(heap)
result.insert(person[1], [-person[0], person[1]])
return result
기억해야할 기법
- 그리디 알고리즘에 접근을 못하는 것 같다
- 문제 풀이만 보면 간단명료한데, 이렇게 풀어야 한다는 도출을 못했다
- 나보다 큰 사람을 알고 있으니, 큰 사람부터 처리하면 인덱스가 간단하게 도출된다
- 그리디 알고리즘에는 우선순위 큐를 먼저 고려해보자
내가 구현한 코드
from typing import List
class Solution:
def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
answer = [[] for _ in range(len(people))]
idx = [i for i in range(len(people))]
prev = (-1, 0)
for v, i in sorted(people):
crnt_i = i
if prev[0] != v:
prev = (v, 1)
else:
crnt_i, prev = crnt_i - prev[1], (prev[0], prev[1] + 1)
answer[idx[crnt_i]].append(v)
answer[idx[crnt_i]].append(i)
del idx[crnt_i]
return answer
- 틀리진 않지만 문제 접근이 이상하다 ㅠㅠ
- 키가 작은 사람부터 처리했다
- 이전 키와 인덱스를 매 루프 계산해야됐다
'책읽기' 카테고리의 다른 글
[파이썬 알고리즘 인터뷰][그리디] 주유소 (0) | 2021.09.01 |
---|---|
[파이썬 알고리즘 인터뷰][그리디] 태스크 스케줄러 (0) | 2021.09.01 |
[파이썬 알고리즘 인터뷰][그리디] 주식을 사고팔기 가장 좋은 시점2 (0) | 2021.08.30 |
[파이썬 알고리즘 인터뷰] 21장 - 그리디 알고리즘 (1) | 2021.08.30 |
[Java의 정석][Chapter-7] 객체지향 프로그래밍 2 (2/2) (0) | 2021.08.23 |