티스토리 뷰

programmers.co.kr/learn/courses/30/lessons/42862

 

문제는 다음과 같다. 체육복을 도난당한 학생들이 있고, 여벌의 체육복을 가지고 있는 학생들이 있다.

도난당한 사람은 자기 앞사람 혹은 뒷사람이 여벌이 있어야만 빌려서 수업에 참여할수 있을때,

총 몇명이 정상적으로 수업참여가 가능한가?

 

def solution(n, lost, reserve):
    answer = n - len(lost)
    for i in range(len(lost)) :
        x = lost[i]
        if x - 1 in reserve :
            reserve.remove(x - 1)
            answer += 1
        elif x + 1 in reserve :
            reserve.remove(x + 1)
            answer += 1

    return answer
#test case 3, 7, 12 실패

처음에 생각나는 대로 짯던 코드. 체육복은 어차피 하나씩만 빌려줄 수 있고 그러면 왼쪽사람부터 빌려주면 더 빌려주거나 덜 빌려주는 경우 없이 사건을 해결할 수 있어서 탐색 순서를 굳이 바꿔줄 필요는 없었다.

answer를 총 인원수 n - 잃어버린 인원수 len(lost) 를 한뒤에 잃어버린 사람이 체육복을 찾을 때 마다 answer에 1씩 더해서 완성했지만 케이스 3개를 실패했다.

 

원인을 찾으려 문제를 다시 잃어보니, 도난당한 사람이 여벌을 가지고 있을 경우 자신의 체육복을 입으므로 빌리거나 빌려주지 않고 끝난다는 것이 문제였다.

lost와 reserve가 중복되는 경우가 있다는것을 생각하면 미리 중복을 제거하고 생각해야 했다.

if문을 하나 더 추가하여 if i in set_lost 로 해결하려 해보았지만 중복을 제거하지 않는이상 순서가 꼬였다.

 

그래서 중복제거에 효율적인 set 자료형을 이용하여 아예 중복을 배제하고 계산해주었다.

answer을 도출하는 방식도 최종적으로 도난후에 빌리지도 못한 학생들을 총 학생수에서 빼주니까 모든 케이스를 통과했다.

 

상관없는 이야기지만 고등학생 시절 도난사건으로 난리가 난적이 있었다. 어린 학생들이 철없이 물건들을 엄청 훔쳐대서 전교생이 조사를 받았었던 기억이 있다. 근데 생각해보니 또 군대시절에도 비슷하게 난리가 났다. 병사 한명이 지갑에 있던 돈이 사라져서 모든 부대 인원들이 쉬지도 못하고 조사를 받았던 기억이 있다.

사람들이 양심좀 가지고 살았으면 좋겠다. 특히 단체생활에서는 더욱..