본문 바로가기
코딩테스트

체육복

by 느림보어른 2021. 5. 28.

문제풀이

def solution(n, lost, reserve):
    
    #잃어버린 학생 중 여벌을 가지고 있는 학생 제외
    for lost_st in lost[:]:
        if lost_st in reserve:
            del reserve[reserve.index(lost_st)]
            del lost[lost.index(lost_st)]
    
    lost.sort()
    reserve.sort()
    
    for lost_st in lost[:]:
         for reserve_st in reserve[:]:
                if lost_st - 1 == reserve_st or lost_st + 1 == reserve_st:
                    del reserve[reserve.index(reserve_st)]
                    del lost[lost.index(lost_st)]
                    break
            
    answer = n - len(lost)
    
    return answer

알고리즘

탐욕법(Greedy)

이 문제의 핵심은 누가 누구에게 빌려주었든 간에 답에는 영향을 끼치지 않는다는 것이다.

나의 코드를 보면 잃어버린 사람 중 자기 여부를 가지고 있는 사람은 다른 사람에게 빌려줄 수 없다고 해서 이 부분을 먼저 처리한 뒤 타인에게 빌려줄 수 있는 경우를 계산한다. 하지만 이 과정(자기 자신에게 여분을 채우는 과정)을 하지 않고 바로 후자인 부분으로 처리해도 큰 문제는 없을 것이다. (다만 자기 자신과 같은 번호일 경우를 추가해야 할 것이다.)

 

탐욕 알고리즘은 여러 경우 중 하나를 결정해야 할 때마다 그 순간에 최적이라고 생각되는 것을 선택해 나가는 방식으로 진행하여 최종적인 해답에 도달한다. 즉, 지역적으로 최적이면서 전역적으로 최적인 문제일 경우이다.

 

탐욕 알고리즘이 잘 작동하는 문제는 대부분 탐욕스러운 선택 조건(greedy choice property)과 최적 부분 구조 조건(optimal substructure)이라는 두 가지 조건이 만족된다. 탐욕스런 선택 조건은 앞의 선택이 이후의 선택에 영향을 주지 않는다는 것이며, 최적 부분 구조 조건은 문제에 대한 최적해가 부분 문제에 대해서도 역시 최적해라는 것이다.

출처

문제: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

탐욕 알고리즘: https://ko.wikipedia.org/wiki/%ED%83%90%EC%9A%95_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

 

'코딩테스트' 카테고리의 다른 글

소수 찾기  (0) 2021.05.28
신규 아이디 추천  (0) 2021.05.28
삼각 달팽이  (0) 2021.05.26
문자열 압축  (0) 2021.05.26
짝지어 제거하기  (0) 2021.05.25