[프로그래머스] 체육복

Juhyang·2020년 9월 10일
0

알고리즘 풀이

목록 보기
8/16
post-thumbnail

문제

전체학생수가 n, 체육복 잃어버린 학생 lost, 여분의 체육복을 가진 reserve.
이때, reserve는 +1, -1 학생에게만 빌려줄 수 있음.
또한 여분의 체육복을 가진 학생이 잃어버릴 수 있고, 이 사람은 남에게 체육복을 빌려줄 수 없다.

체육복을 모두 입을 수 있는 학생수 리턴하기.


import collections

def solution(n, lost, reserve):
    answer = 0
    
    # 여벌 체육복 가져왔는데 도난당한 애 체크 (중복제거)
    tReserve = collections.Counter(reserve) - collections.Counter(lost)
    tLost = collections.Counter(lost) - collections.Counter(reserve)
    
    reserve = list(tReserve);
    lost = list(tLost);
    
    # 오름차순 정렬
    lost.sort()

    
    check = [] # 이미 빌려준 애들 체크하는 배열
    for i in reserve:
        check.append(0);
        
        
    ok = []; # 빌려서 문제 없는 애들 배열
    
    for i in range(len(lost)):
        for j in range(len(reserve)):
             if check[j] != 1 and 
             lost[i]-1 == reserve[j] or lost[i]+1 == reserve[j]:  
             # 빌려준적이 없고, 해당 조건을 만족할 때
                
                check[j] = 1;  # 이미 빌려줬으므로 1로 체크 
                ok.append(lost[i]);
    
             
    ok = list(set(ok))
    no = collections.Counter(lost) - collections.Counter(ok)
    
    answer = n - len(list(no))        
   
    return answer

사용한 테스트 케이스


로직
1. 미리 여분의 체육복을 가지고 있고, 잃어버린 학생 빼버리기 (중복제거)
2. 잃어버린애 오름차순 정렬 (솔직히 이거해서 통과했는데 왜 정렬해야하는지 모름...)
3. 이미 빌려준 애들을 체크하는 배열을 만들고, 빌려줬으면 마크해서 두번 못빌려주게 하기.
예) lost[1,3] , reserve[2] 이면 둘 중 하나만 빌려 줄 수 있음.
나의 경우 1번 빌려주고 위에서 체크해서 3번 못빌려주게 해버림.
4. 체육복 빌려줘서 정상적으로 입을 수 있는 애들은 ok 배열에 넣기
5. lost 에서 ok 배열 빼서 못입은 애들 구하고, 전체에서 뺌.


다른풀이

def solution(n, lost, reserve):
    _reserve = [r for r in reserve if r not in lost]
    _lost = [l for l in lost if l not in reserve]
    for r in _reserve:
        f = r - 1
        b = r + 1
        if f in _lost:
            _lost.remove(f)
        elif b in _lost:
            _lost.remove(b)
    return n - len(_lost)

와우 ㅜㅜ..
미리 +랑 - 해서 이 값들이 있으면 지워버리는 형태로 짜셨다.
훨씬 간결하고 이해가 된다.. 생각의 전환 !!


배운점

이전에 counter 사용법을 배웠는데 이번에 유용하게 사용함.
근데 질문하기에 나온 모든 테스트 케이스를 넣어도 통과하는데
유난히 2,3,4,5 가 안되어서 고생좀 했는데 정답은 lost 오름차순하기.

근데 왜 오름차순해야 되는지 이유를 모르겠다..
오늘의 숙제.. 왜 오름차순해야하는지 알아낼것..!

profile
kurly - commerce web development

0개의 댓글