알고리즘/그리디

[프로그래머스] 체육복

아뵹젼 2022. 9. 14.

 

 

 

나의 풀이

def solution(n, lost, reserve):
    lost.sort()
    reserve.sort()

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

    for i in lost[:] :
        if i-1 in reserve :
            reserve.remove(i-1)
            lost.remove(i)
        elif i+1 in reserve :
            reserve.remove(i+1)
            lost.remove(i)
        
    return n - len(lost)
  • 먼저 lost, reserve 리스트를 오름차순으로 정렬한다.
  • 만약 reserve 에 있는 학생이 lost 에도 있다면, 해당 학생을 두개의 리스트에서 각각 제거한다.
  • 만약 lost 에 있는 학생 번호보다 1 작은 번호가 reserve 에 있다면, 체육복을 우선으로 빌린다.
  • (중복된 번호가 없으므로, 나보다 앞에 있는 학생은 내 뒤에 있는 학생들에게 빌려줄 수 없음)
  • 그런 다음, 1 앞에 있는 번호가 없다면 1뒤에 있는 번호가 있는지 확인하고, 그 학생에게 체육복을 빌린다.

 

 

다른 풀이

def solution(n, lost, reserve): 
    answer = 0 
    
    reserve_del = set(reserve)-set(lost) 
    lost_del = set(lost)-set(reserve) 
     
    for i in reserve_del: 
        if i-1 in lost_del: 
            lost_del.remove(i-1) 
            
        elif i+1 in lost_del: 
            lost_del.remove(i+1) 
            
    answer = n - len(lost_del)
    
    return answer
  • sort 를 이용하지 않아도 되는 풀이이다.
  • set(집합) 을 이용해 여벌이 있지만, 잃어버린 학생 번호를 모두 지운다.
  • 그런다음, 여벌이 있는 학생 번호를 돌면서
  • 먼저 내 앞에 있는 학생에게 빌려주고, 앞에 있는 학생이 없다면 내 뒤 학생에게 빌려주도록 한다.
  • # 잃어버린 학생 : 4 2
    # 여벌이 있는 학생 : 3 6 5 을 예시로 들자.
  • 만약 3번 학생이 내 뒤에 있는 4번에게 먼저 빌려준다면, 2번 학생은 빌릴 곳이 없게 된다.
  • 따라서 항상 앞에 있는 학생에게 우선적으로 빌려주어야 한다.

댓글