본문 바로가기

Algorithm/Problems

[Programmers] 체육복

문제.

...더보기

체육복을 도난 당한 사람에게 여벌의 체육복이 있는 사람들이 체육복을 빌려주어, 최대한 많은 사람이 체육복을 입을 수 있도록 하자. 다만, 체육복은 자기 바로 앞, 뒤 번호의 사람에게만 빌릴 수 있다.

제한조건.

1. 사람들은 번호로 주어진다.

2. 학생의 수는 2명 이상 30명 이하이다.

3. 중복되는 번호는 없으며, 도난당한 수 / 여벌을 가져온 수 모두 1명 이상 n명 이하이다.

4. 여벌을 가져온 학생이 도난을 당했을 수도 있다.

풀이.

def solution(n, lost, reserve):
    lost_ = []
    reserve_ = []
    for i in lost:
        if not i in reserve:
            lost_.append(i)
    for i in reserve:
        if not i in lost:
            reserve_.append(i)
    
    non_people = len(lost_)
    
    for i in lost_:
        if (i-1) in reserve_:
            non_people -= 1
            reserve_.remove(i-1)
            
        elif (i+1) in reserve_:
            non_people -= 1
            reserve_.remove(i+1)
        
    answer = n - non_people
    
    return answer

 

Step 1.

문제의 제한조건인 여벌 체육복을 가져온 사람 중 도난을 당한 케이스를 먼저 처리해줘야 합니다. 즉 reserve와 lost에 중복으로 담겨있는 값을 제거해줍니다.

Step 2. 

분실한 사람(lost에 있는 요소)을 하나씩 뽑은 뒤, 앞 뒤 값들이 여벌이 있는 사람(reserve에 있는 요소)에 담겨있는지 비교합니다. 만약 있을 경우, 분실한 사람의 수를 하나씩 줄여나갑니다.


lost 와 reserve 를 비교하여 중복된 값을 제거해준 새로운 리스트를 만드는 코드의 경우, 리스트 문법을 사용하면 더 간단하게 구현할 수 있습니다.

lost_ = [l for l in lost if not l in reserve]
reserve_ = [r for r in reserve if not r in lost]

'Algorithm > Problems' 카테고리의 다른 글

[Programmers] 영어 끝말잇기  (0) 2019.10.02
[Programmers] Level 1(part. 2)  (0) 2019.09.28
[Programmers] Level 1(part. 1)  (0) 2019.09.24
[백준] 11047번 - 동전 0  (0) 2019.09.17
[백준] 11399번 - ATM  (0) 2019.09.16