본문 바로가기

알고리즘 공부/프로그래머스 > Python3

[프로그래머스] 체육복

https://programmers.co.kr/learn/courses/30/lessons/42862

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr

 

[오답1] → '코드 실행' 통과. '제출 후 채점하기' 정답률 33.3%

 

[오답2] → '코드 실행' 통과. '제출 후 채점하기' 정답률 75.0%

 

※ 이 때 발견한 제한사항! (역시 문제를 잘 읽어야 해,,,)

여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

 

[오답3] → '코드 실행' 통과. '제출 후 채점하기' 정답률 91.7%

 

[정답]

 

1. lost와 reserve의 차집합을 구해서 리스트 n_lost를 초기화한다.

2. reserve와 lost의 차집합을 구해서 리스트 n_reserve를 초기화한다.

( ↑제한사항의 "여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다." 를 처리해주기 위한 작업 )

3. n_lost를 i에 넣어 for문을 돌면서 i-1이 있다면 n_reserve에서 i-1를 없애주고, i+1이 있다면 n_reserve에서 i+1을 없애주고, i-1과 i+1이 n_reserve에 없다면 lost_student에 1을 더해준다.

( 옆친구들이 체육복 여분이 있으면 여분의 친구꺼를 빌리면서 여분의 친구를 reserve에서 제거하고, 옆친구들이 모두 여분이 없다면 체육복이 없고 빌리지도 못한 학생이므로 lost_student의 수를 더해준다. )

4. 결과적으로 학생 수 n에서 체육복이 없고 빌리지도 못한 학생인 lost_student를 빼주어 answer에 넣어준다.

5. answer을 return한다.