Algorithm/문제
[프로그래머스] 체육복
Lim Seung Hyun
2021. 10. 17. 17:47
문제 정의
- 여벌의 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있음
- N번 학생은 N-1번, N+1번 학생의 체육복만 빌릴 수 있음
- 여벌의 체육복을 가지고 있는 학생이 도난을 당한 경우, 대여할 수 있는 체육복이 없음 -> 본인의 체육복을 이용
- 체육복을 이용할 수 있는 최대 학생 수를 구하는 문제
나의 풀이
# source : https://programmers.co.kr/learn/courses/30/lessons/42862
def solution(n, lost, reserve):
able_lst = [0 for _ in range(n)]
lost = sorted(lost)
reserve = sorted(reserve)
# 체육복을 가지고 있는 학생에 대한 값 변경
for i in range(n):
if i+1 not in lost:
able_lst[i] = 1
for lt in lost: # 도난당했지만 여유분이 있는 학생 처리
if lt in reserve:
reserve.remove(lt)
able_lst[lt-1] = 1
for lt in lost:
if lt - 1 in reserve: # 대여 가능한 범위에 대한 처리
able_lst[lt-1] = 1
reserve.remove(lt-1)
elif lt + 1 in reserve: # 대여 가능한 범위에 대한 처리
able_lst[lt-1] = 1
reserve.remove(lt+1)
return sum(able_lst)
- lost에 포함되면서 reserve에 포함된 학생을 먼저 처리해주었다.
- lost : [1,2] reserve : [2, 3] 인 경우, 2번 학생이 도난되었기 때문에 대여해줄 수 있는 여유분이 없기 때문에 없는 학생으로 처리해야 lost에 포함된 1번 학생이 2번 학생에게 체육복을 대여할 수 있는 케이스를 차단할 수 있다.
개선할 점
- N의 범위가 적어 시간 복잡도를 고려하지 않았지만 N의 범위가 커지는 경우를 대비하여 시간 복잡도를 고려하여 로직을 작성하도록 노력해야겠다.
- 코드를 좀 더 파이썬스럽게 작성하도록 노력해야겠다.
Github : https://github.com/Limseunghyun95/code_test/blob/master/programmers/p_42862.py
728x90