KEEP GOING
[python] 프로그래머스 42862번 : 체육복 본문
https://programmers.co.kr/learn/courses/30/lessons/42862
난이도 1인데 되게 많은 고민을 해야 했던 문제였다 : <
1. lost 배열과 reserve 배열이 정렬되어 주어진다는 보장 x
2. 여벌이 있지만 옷을 도난 당한 경우, 다른 사람에게 빌려 줄 수 없다. -> lost, reserve 배열에서 제거
3. i-1, i+1번 학생이 모두 체육복을 도난 당한 경우, 여벌이 있는 i번째 학생은 i-1번 학생에게 체육복을 빌려준다. (그리디)
i+1번 학생은 뒤 학생이 빌려줄 수도 있지만 (i+2번 학생이 체육복이 있는 경우) i-1번 학생은 그렇지 않아서..
[정답코드]
def solution(n, lost, reserve):
answer = 0
# 정렬
lost.sort()
reserve.sort()
# 여벌있으면서 도난 당한 경우
for r in reserve[:]:
if r in lost:
reserve.remove(r)
lost.remove(r)
# 여벌이 있는 경우 빌려주고 lost 배열에서 제거
for r in reserve[:]:
if r-1 in lost:
lost.remove(r-1)
elif r+1 in lost:
lost.remove(r+1)
return n-len(lost)
[틀린풀이]
def solution(n, lost, reserve):
answer = 0
for r in reserve:
if r in lost:
reserve.remove(r)
lost.remove(r)
for r in reserve:
if r-1 in lost:
lost.remove(r-1)
elif r+1 in lost:
lost.remove(r+1)
return n-len(lost)
틀린 이유 )
1. lost, reserve 배열 정렬 안함
2. for문을 돌면서 remove로 리스트 내 원소 제거시
for r in reserve:
if r in lost:
reserve.remove(r) 에서 문제 발생!
arr = [1,2,3,4,5]
for i in arr:
print(i)
arr.remove(i)
for문으로 배열 내 원소를 삭제할 때 1에서 5까지 모든 원소가 제거되었다고 생각할 수 있지만 사실 그렇지 않다.
remove 함수 사용시 원본 배열인 arr도 훼손되기에 이러한 문제가 발생한다.
구체적을 설명하자면 아래와 같은 방식으로 1, 3, 5 가 출력된다는 사실을 알 수 있다.
for i in arr:
print(1) --- 배열에서 첫번째 원소
arr.remove(1) : 배열에서 1제거
arr = [2,3,4,5]
print(3) --- 배열에서 두번째 원소
arr.remove(3) : 배열에서 3제거
arr = [2,4,5]
print(5) --- 배열에서 세번째 원소
arr.remove(5) : 배열에서 5제거
이러한 로직대로 동작하기에 따라서 배열 내에는 2, 4가 남는다.
이러한 문제를 해결하기 위해서는 for문에서 슬라이싱을 활용하여원본 배열이 아닌 복사 배열을 사용하면 된다.
for r in reserve[:]:
if r in lost:
reserve.remove(r)
'code review > greedy' 카테고리의 다른 글
[python] 백준 2437번 : 저울 (0) | 2022.03.02 |
---|---|
[python] SWEA : 컨테이너 운반 (0) | 2022.02.11 |
[python] SWEA 5203 : 베이비진 게임 (0) | 2022.02.11 |
[python] 백준 10610 : 30 (0) | 2022.02.10 |
[python] SWEA 5202 : 화물 도크 (0) | 2022.02.08 |