본문 바로가기

Python

프로그래머스 - 체육복

https://school.programmers.co.kr/learn/courses/30/lessons/42862?language=python3

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

해설

def solution(n, lost, reserve):
    answer = n
    rest_in_lost_count = 0
    
    # lost 배열을 정렬해준다.
    lost.sort()
    
    filtered_lost = []
    # 여벌있는 학생이 도난당했을 경우, 본인의 체육복 1개만 있으니 빌려줄 수 없다.
    for lost_num in lost:
      if reserve.count(lost_num) == 1:
        reserve.remove(lost_num)
      else:
        filtered_lost.append(lost_num)
    
    for lost_std_num in filtered_lost:
      front_std_num = lost_std_num - 1
      back_std_num = lost_std_num + 1
        
      if reserve.count(front_std_num) == 1: # 만약 앞번호 학생이 여분 있다면
        rest_in_lost_count += 1
        reserve.remove(front_std_num)
      elif reserve.count(back_std_num) == 1: # 만약 뒤번호 학생이 여분 있다면
        rest_in_lost_count += 1
        reserve.remove(back_std_num)
        
    answer -= (len(filtered_lost) - rest_in_lost_count)
    return answer

 

lost 배열의 학생 번호를 앞에서부터 순회하면서 해당 번호의 앞번호, 뒤번호가 reserve 배열에 있으면 체육복을 빌릴 수 있다.

lost 배열을 앞에서부터 순회하기 위해서는 우선 정렬을 해줘야하므로 sort() 메서드 사용

 

조건에서 여벌을 가진 학생이 도난 당했을 수도 있고 이 경우 빌려줄 수는 없다고 했으므로 lost 배열과 reserve 배열에 같은 번호가 있으면 두 배열에서 모두 제거해준다.

 

lost 배열의 앞번호부터 순회하기 때문에 여분이 있는 번호를 찾을 때에도 lost 학생의 앞번호부터 존재하는지 체크해야한다. 왜냐하면 lost = [2,4] reserve = [1, 3] 일 때, 2번 학생이 3번학생한테 빌리게 되면 1번 학생은 4번학생에게 빌려줄 수 없으므로 에러 케이스가 발생한다.

 

마지막으로 전체 잃어버린 학생의 수에서 빌린 학생 수를 빼면 빌리지 못한 학생 수를 알 수 있다. 전체 학생 수 n에서 빌리지 못한 학생 수를 빼면 체육수업을 들을 수 있는 학생 수를 알 수 있다.