본문 바로가기

그 땐 Algorithm했지/그 땐 Programmers했지

[self-study/level 1] 체육복 | 탐욕법(Greedy) - 해결편

728x90

문제

https://itwithruilan.tistory.com/43?category=999011 

 

[self-study/level 1] 체육복 | 탐욕법(Greedy) - 도전편

문제 내 풀이 1️⃣첫 번째 시도 def solution(n, lost, reserve): lost_and_reserve_student = set(lost) & set(reserve) for student in lost_and_reserve_student: lost.remove(student) reserve.remove(stud..

itwithruilan.tistory.com

이전 포스팅에 이어서 계속 같은 문제 도전!

내 풀이

3️⃣세 번째 시도

def solution(n, lost, reserve):
    lost = sorted(lost)
    reserve = sorted(reserve)
    lost_and_reserve_student = set(lost) & set(reserve)
    if len(list(lost_and_reserve_student)) != 0:
        for student in lost_and_reserve_student:
            lost.remove(student)
            reserve.remove(student)

    taking_class_student = []
    for lost_student in lost:
        for reserve_student in reserve[:]:
            if lost_student == (reserve_student + 1) or lost_student == (reserve_student - 1):
                reserve.remove(reserve_student)
                taking_class_student.append(lost_student)
                break
    return n - (len(lost) - len(taking_class_student))

👉🏻Thanks to shk... shk께서 내 코드를 읽어보고 오류가 나는 부분을 찾아 고쳐주었다ㅜㅜ 잃어버린 학생과 빌려줄 학생 리스트를 미리 정렬을 했고 이후 로직은 똑같다.

 

✅for문과 remove를 함께 쓸 때 주의해야할 점

list = [1, 2, 3, 4, 5]
for i in list:
	print(i)
    list.remove(i)
    
#1
#3
#5

👉🏻remove로 list의 요소를 지우면 for문은 지워진 상태의 list를 받아 돌리게 된다. 때문에 for문을 두 번째 돌릴 때 print문에서 2가 나오지 않는 이유는 돌아가는 list 상태가 [2, 3, 4, 5]이기 때문이다. 이 리스트에서 2번째는 3이니까 print할 때 3이 출력된다. 

✍🏻list 데이터를 온전히 보전하고 싶으면 [:]를 넣으면 된다. list의 복사본을 넣어서 돌리기 때문에 데이터 누락을 막을 수 있다!

728x90