본문 바로가기
  • Trace
취업/알고리즘이야

프로그래머스 > 탐욕법 > 체육복

by seleuchel 2022. 4. 6.

 

remove()가 리스트원본을 훼손시키는 경우, 반복문이 비정상적인 동작(요소를 건너 뜀)을 간과했음

여기서 뱅글뱅글 돌았음..

 

[hint]

1) 첫 번째 틀림 : 코드가 오름차순으로 진행되니까, 아래서부터 처리해야함.

2) 두 번째 틀림 : ????? -> 누군가 sort를 써보라 했는데, 다른 문제가 더 생겨났다?

3) 세 번째 틀림 : ????? -> 한창 찾다가 remove가 문제였음을 알았음

 

사실, 내 방식대로 하면, sort가 의미가 없음.

대신 효율성이 매우 떨어짐.. 

 

나는 lost에 중점을 두었지만, 다른 분들은 reserve에 중점을 둔 듯

이후에는 이 코드를 개선해봐야겠다.

1) reserve 중심

2) 효율성 개선

 

풀이 코드

1) lost와 reserve의 중복 인원은 모두 제거 : 여기서 문제가 생김..

2) 나머지 처리

ㄴ lost인 것과 아닌 것으로 구분되므로

    ㄴ lost면 체육복을 빌리거나 못 빌리거나

    ㄴ lost 아니면, 체육복이 있는 상태 + 여분이 있는 상태 + 체육복을 잃어버렸으나 여분이 있는 상태 이므로 +1 한다.

 

    count = 0 # 수업듣는 사람
    
    # 제거 (중복을 먼저 제거)
    for j in lost[:]:
        if j in reserve[:]:
            lost.remove(j)
            reserve.remove(j)
    
    # 그 다음에 나머지 처리
    for i in range(1,n+1):
        if i in lost: # 잃어버림 # 여분 옷이 없음
            if i-1 in reserve: 
                count += 1
                lost.remove(i)
                reserve.remove(i-1)
            elif i+1 in reserve:
                count += 1
                lost.remove(i)
                reserve.remove(i+1)                    
        else:
            count += 1 # 안 잃어버림
            
	return count

 

 

 

 

 

'취업 > 알고리즘이야' 카테고리의 다른 글

[지금 하고 있는 것]  (0) 2022.04.06
파이썬 함수를 생각없이 쓰면 피를 본다  (0) 2022.04.06
그리디  (0) 2022.04.06
remove 반복문 주의  (0) 2022.04.06
헷갈림 : enumerate / iterator / generator  (0) 2022.04.02