[프로그래머스 Lv1] 체육복 (파이썬)

Jewon Joel Park·2022년 5월 31일
0

Programmers-solution

목록 보기
10/34

문제 링크


문제 설명

학생 수, 체육복이 없는 학생 번호, 여분의 체육복이 있는 학생 번호가 주어질 때, 체육수업에 참석할 수 있는 학생의 수를 반환하는 함수 작성


제한사항

  • 전체 학생의 수는 2명 이상 30명 이하
  • 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없음
  • 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없음
  • 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있음
  • 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있음. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없음.

풀이 코드

def solution(n, lost, reserve):
    reserve_set = set(reserve)-set(lost)
    lost_set = set(lost)-set(reserve)
    
    for r in reserve_set:
        if r-1 in lost_set:
            lost_set.remove(r-1)
        elif r+1 in lost_set:
            lost_set.remove(r+1)
            
    return n-len(lost_set)

코드 설명

  1. 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있음. 이라는 부분에 주목할 필요가 있음.
  2. 여벌 체육복을 가져온 학생 중 한 벌을 잃어버려 더 이상 빌려줄 수 없는 학생 목록을 제거한 reverse_set 생성 (set의 차집합 응용)
  3. 마찬가지로 여벌 체육복을 분실한 학생은 체육복을 빌릴 필요가 없기 때문에 해당 목록을 제거한 lost_set 생성
  4. 여벌 체육복을 들고온 학생 목록을 순회하며 자신의 앞번호 또는 뒷번호 학생이 체육복을 분실한 목록에 있는지 확인
  5. 3번 결과에 해당사항이 존재할 경우 lost_set에서 해당 번호 제거
  6. 전체 학생 수에서 lost_set에 남은 학생 수를 제하면
    수업에 참석 가능한 최대 학생수가 반환됨

cf) 이유는 확실하지 않으나, if절의 r-1r+1의 순서를 바꿔서 실행해보면 20개의 테스트케이스 중 5개가 실패하게 되니 주의.

profile
10년을 돌고 돌아 마침내 제자리를 찾은 문과 출신 Python 개발자의 인생기록장

0개의 댓글