Algorithm/알고리즘 문제

[프로그래머스][Python] 체육복

은 딩 2023. 10. 10. 11:14

[프로그래머스][Python] 체육복

https://school.programmers.co.kr/learn/courses/30/lessons/42862#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


아이디어

defaultdictionary를 만들어서 여분이 있고 lost에 포함되지 않는 번호는 value를 2, 여분이 있지만 도난 당했으면 value 1로 설정해뒀다.

lost 리스트를 돌면서 잃어버린 번호의 앞 번호, 그 다음 뒷 번호를 확인하면서 여분이 있으면 하나씩 나눠 갖도록 코드를 짰다. 여기서 중요한 점은 내 코드는 앞 번호부터 확인했기 때문에 lost 리스트를 정렬한 상태로 진행해야 한다.

그 이유는 n=5, lost=[4,2], reserve=[3,5] 일 때 2번은 3번의 여유분을 갖고 4번은 5번의 여유분을 가지면 answer이 5가 나오고 끝난다. 하지만 정렬을 안 한 상태에서 돌리면 lost 기준으로 앞 번호부터 확인하니까 4번은 3번의 체육복을 빌리게 되고 2번은 결국 체육복을 빌리지 못하게 되어 answer이 4가 나온다.

 

코드 짜다가 막혔던 반례)

n=5, lost=[4,2], reserve=[3,5]

>> answer: 5

 


코드

from collections import defaultdict
def solution(n, lost, reserve):
    answer = 0
    dict = defaultdict(int)
    for i in reserve:
        if i not in lost:
            dict[i] = 2
        else:
            dict[i] = 1
    
    lost.sort()
    for i in lost:
        if dict[i] >= 1:
            continue
            
        elif dict[i-1] == 2:
            dict[i] = 1
            dict[i-1] = 1
            
        elif dict[i+1] == 2:
            dict[i] = 1
            dict[i+1] = 1
            
        else: # can't borrow
            answer += 1
        
        
    # n - (체육복 없는 애들)    
    return n - answer