체육복 - 프로그래머스 - Level 1

nnoobbaagguu·2022년 7월 29일
0

알고리즘 공부

목록 보기
2/4

체육복 - 프로그래머스 - Level 1

일단 이 문제를 풀 때 큰 실수(for loop 안에서 list의 remove 사용 금지)를 했다.

일단 여분의 체육복이 있는데 체육복을 분실한 학생들을 처리해야 한다. 사실상 이 학생들은 체육복을 한 개만 가져온 학생들과 다를 바가 없으므로, lost와 reserve 리스트에서 삭제한다.

    remove_list = []
    for i in reserve:
        if i in lost:
            remove_list.append(i)
    for i in remove_list:
        lost.remove(i)
        reserve.remove(i)
    

그리고 lost 리스트를 오름차순으로 정렬한다. 이 그리디 문제에서 가장 중요한 점은 체육복을 잃어버린 학생들을 탐색하는 순서와 그에 따라 여분의 체육복을 가져온 학생들을 탐색하는 순서이다. 번호를 오름차순으로 탐색할 지, 내림차순으로 탐색할 지, 둘 중에서 확실히 한 쪽을 정해야 한다. 오름차순으로 탐색하면 체육복을 분실한 학생 n이 lost에 있으면 n-1이 reserve에 있는지 확인 후 n+1이 reserve에 있는지 확인해야 한다. 반대로 내림차순으로 탐색하면 체육복을 분실한 학생 n이 lost에 있으면 n+1이 reserve에 있는지 확인 후 n-1이 reserve에 있는지 확인해야 한다.

    lost.sort()
    answer = n
    for i in lost:
        if i-1 in reserve:
            reserve.remove(i-1)
            answer += 1
        elif i+1 in reserve:
            reserve.remove(i+1)
            answer += 1  
    answer -= len(lost)
    return answer

0개의 댓글