알고리즘

[웅's 프로그래머스] 체육복 - 파이썬(python) 풀이

CodeBoyEd 2021. 9. 22. 16:48

체육복 문제는... 정말 해결이 안되는 테스트 케이스가 있었던 문제다

그 이유는 reserve 배열이 정렬이 안되서 들어오는 것이었던 것!! 나는 예시도 정렬이 되어 있고 하다보니 당연히 정렬이 되어 있을 줄 알았다.

 

이 문제를 통해 가장 강하게 깨달은 점은 list 에서 알 수 없는 (?) 오류가 생기면

1. deep copy, shallow copy, 참조 문제가 아닐까?

2. 정렬 문제가 아닐까?

를 생각해 봐야지 라는 점이다.

 

문제 자체는 크게 어렵지 않았던 것 같다. 학생들의 수와 맞게 list 를 만들고 모두 체육복을 가지고 있다는 뜻에서 1을 참조하도록 한다.

 

그리고 잃어 버린 학생 리스트가 나오므로 lost 배열에 따라서 해당하는 학생을 1 => 0 으로 만들어 준다.

 

그리고 제약 조건에 나와있는 하나를 더 가지고 있어도 원래 자기꺼를 잃어버려서 공유 할 수 없는 학생들!! 과 공유할 수 있는 학생들을 분리하여 따로 new_reserve 라는 리스트를 만들었다.

 

그리고 공유할 수 있는 new_reserve 학생들을 기준으로 기준 학생 앞에 친구가 혹시 필요한지? 그리고 앞에 친구가 필요 없으면 뒤에 친구가 필요한지? 체크하는 로직이다.

 

앞에부터 체크하는 이유는 for 문이 낮은 수부터 올라가는 순서이기 때문에 뒤에 부터 체크할 경우 맨 마지막 학생의 체육복이 남을 경우에 수가 있다. 이해를 돕기 위해 예시를 그림으로 그려보겠다.

 

def solution(n, lost, reserve):
    reserve.sort()
    students = [1]*n

    for l in lost:
        students[l-1] = 0
    
    new_reserve = []
    for r in reserve:
        if students[r-1]==0:
            students[r-1] = 1
        else:
            new_reserve.append(r)

    for r in new_reserve:
        if r-2>=0 and students[r-2]==0:
            students[r-2] = 1
        elif r<len(students) and students[r]==0:
            students[r] = 1

    return sum(students)