프로그래머스 체육복
여분 체육복 O : 1 3 5
X : 2 4
1번이 2번에게 빌려주고, 3번이 4번에게 빌려준다.
또는
3번이 2번에게 빌려주고, 5번이 4번에게 빌려준다.
위 과정에서 머릿속으로 그린 그림을 절차적으로 기술하는 것이 곧 알고리즘의 핵심이다.
탐욕법: 알고리즘의 각 단계에서 그 순간에 최적이라고 생각되는 것을 선택한다. 탐욕스럽게!
[방법1]
학생의 수는 기껏해야 30명. 학생 수만큼 배열을 확보하고, 각자가 가지고 있는 체육복의 수를 기록한다.
그리고 번호 순서대로 스캔하며 빌려줄 관계를 정한다. 시간복잡도는 O(N)
- 단, n이 커지면 시간초과 문제가 발생한다.
- 또한 n배열로 인해 메모리가 매우 많이 필요하고
- n번을 순차탐색해야해서 비효율적이다.
def solution(n, lost, reserve):
# 모두 1벌씩
students = [1] * (n + 1)
# 잃어버린 경우
for l in lost:
students[l] -= 1
# 여분 있는 경우
for r in reserve:
students[r] += 1
# 앞뒤 확인하며 빌려줄 수 있는 경우 찾기
for idx, s in enumerate(students):
if s == 2: # 2벌
if students[idx - 1] == 0: # 좌 확인
students[idx - 1] += 1
students[idx] -= 1
elif (idx+1 <= n) and students[idx + 1] == 0: # 우 확인
students[idx + 1] += 1
students[idx] -= 1
return len([i for i in students[1:] if i != 0])
[방법2]
n이 매우 크다면? reserve 학생(K)은 매우 적다면? reserve 정렬 후, 하나하나 살펴보면서 빌려줄 앞, 뒤 학생을 찾는다.
이때 reserve의 길이를 K라고 하면 여벌의 체육복을 가져온 학생들을 정렬하는 데에 O(K * log K) 이다.
K만큼 O(K) 반복하면서 빌려줄 수 있는 다른 학생을 찾아서 처리한다. 해시 사용하면 O(1)만에 처리가 가능하다.
'코딩테스트 > 프로그래머스 스터디' 카테고리의 다른 글
[해시-Lv1] 완주하지 못한 선수 (0) | 2022.10.27 |
---|