[ python level 1 ] 체육복

안영우·2021년 3월 29일
0

[ 프로그래머스 ]

목록 보기
4/10
post-thumbnail

📌 체육복

체육복을 도난당한 학생에게 여벌의 체육복을 갖고있는 학생이 빌려주는 문제이다.
n = 전체 학생, reserve = 여벌의 체육복이 있는 학생, lost = 체육복을 잃어버린 학생


💡 나의 풀이

문제에서 각각의 학생을 key - value의 형태를 띄고있는 dictionary가 아닌, 리스트로 주어졌다.

전체 학생의 수가 5이면 n = [1, 2, 3, 4, 5]로 표현 가능하고 또, 체육복을 빌려줄때는 바로 앞번호의 학생이나 뒷번호의 학생에게만 빌려 줄 수 있다고 했다. 그래서 index별로 값을 비교해서 나올수 있는 경우의 수를 분류했다.

여벌의 체육복을 빌려주는 경우의 수는 크게 2가지가 있다.

  1. lostreserve에 포함되지 않는 경우
  • reserve[i] == lost[j] + 1이면 여벌의 체육복을 빌려 줄 수 있다.
  • reserve[i] == lost[j] - 1이면 여벌의 체육복을 빌려 줄 수 있다.
  1. lostreserve가 포함되는 경우
  • 이때는 여벌 체육복을 가져온 학생이 체육복을 도난당했으므로, 다른 학생에게 체육복을 빌려 줄 수 없다. 따라서, reserve의 값은 사용할 수 없다.

마지막에는
1. 전체 학생에서 잃어버린 학생을 빼주고(rest)
2. 여벌의 체육복을 빌려준 reserve는 잃어버린 학생(lost)의 값을 가지고 있으므로 (borrow)
3. restborrow의 합집합을 구하면 체육복을 가지고 있는 학생의 최댓값을 구할 수 있다.

코드는 다음과 같다.

def solution(n, lost, reserve):
    n = [i for i in range(1, n+1)]

    for i in range(len(reserve)):
        for j in range(len(lost)):
            if lost[j] in reserve:  # 여벌의 체육복을 가져온 학생이 도난당한 경우
                continue
            elif reserve[i] == lost[j] + 1 or reserve[i] == lost[j] - 1: # 여벌의 체육복을 빌려 줄 수 있는 경우
                reserve[i] = lost[j]
    
    rest = set(n) - set(lost)
    borrow = set(lost) & set(reserve)
    return len(rest | result)
profile
YW_Tech

0개의 댓글