KEEP GOING

[python] 프로그래머스 42862번 : 체육복 본문

code review/greedy

[python] 프로그래머스 42862번 : 체육복

jmHan 2022. 4. 1. 22:24
반응형

https://programmers.co.kr/learn/courses/30/lessons/42862

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr

난이도 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
Comments