[Python LV.1] 체육복

문제 풀이

풀다가 분명 논리에 문제 없는데 왜 자꾸 터지지 해서 다시 지문을 읽어보니 조건 중 "여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다." 라는 문구 때문에 터지는 것을 알았습니다. 악랄하네요.. 이게 레벨 1.....?

그 외에는 그냥 그리디에 충실하게 풀면 됩니다.

어려운건 없고 아래의 조건만 만족하게끔 설계하면 됩니다.

  • 여유분이 있는 학생 중 가장 체격이 작은 학생(본인)이
  • 잃어버린 학생 중 본인보다 체격이 -1인 학생에게 먼저 빌려준다
  • 본인보다 체격이 -1인 학생이 없다면 +1인 학생에게 빌려준다
  • 받은 사람의 번호를 잃어버린 리스트에서 제거
  • 전체 학생 수 n에서 남은 잃어버린 사람의 수를 빼면 끝

왜 -1인 사람을 먼저 찾느냐? 

=>  본인보다 큰 사람(lost)은 나보다 체격이 큰 사람(reserve)이 옷을 빌려줄 수 있지만 본인보다 체격이 작은 사람은 나 말곤 아무도 빌려줄 수 없기 때문입니다.

풀이 코드

def solution(n, lost, reserve):
    # 여벌이 있지만 도난당한 학생은 빌려줄 수 없음. 이거 누가 조건 넣어놨냐
    real_reserve = set(reserve) - set(lost)
    real_lost = set(lost) - set(reserve)
    rr = sorted(list(real_reserve))
    
    for i in rr:
        # 내 앞번호가 잃어버린거 먼저
        if i - 1 in real_lost:
            real_lost.remove(i - 1)
        # 내 뒷번호가 다음
        elif i + 1 in real_lost:
            real_lost.remove(i + 1)
            
    return n - len(real_lost)

 

반응형