📝 문제
> 점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
https://programmers.co.kr/learn/courses/30/lessons/42862
코딩테스트 연습 - 체육복
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번
programmers.co.kr
- 문제 이해를 돕기 위해 입출력 예시 1번 조건대로 그림을 그려보았다. 2번 학생과 4번 학생은 체육복을 도난당했고, 1번 3번 5번 학생은 여벌의 체육복이 있었기 때문에 2번 4번은 양쪽에 여벌이 있어서 체육복을 잘 빌릴 수 있게 되었다. 그래서 이 조건에서는 체육 수업을 들을 수 있는 학생의 최댓값이 5이다.
🎨 풀이
💡 첫번째 시도 = 성공(은 아니지만 다른 코드가 기억이 안난다 ㅠㅠ)
def solution(n, lost, reserve):
answer = 0
lost.sort()
reserve.sort()
for num in lost[:] :
if num in reserve[:]:
reserve.remove(num)
lost.remove(num)
for num in lost[:] :
if num-1 in reserve[:] :
reserve.remove(num-1)
lost.remove(num)
elif num+1 in reserve[:] :
reserve.remove(num+1)
lost.remove(num)
answer = n - len(lost)
return answer
> 이 코드의 핵심은, "체육복 빌렸으면 lost에서 제거!" 이다.
1. lost와 reserve를 정렬해주었다. > 이거 안해주니까 테스트 13,14번이 통과가 안되더라.
2. for문을 돌면서, 만약 lost와 reserve 두 리스트에 모두 포함된 숫자가 있다면 remove 해준다.
> 제안사항을 맨 마지막에 "여벌을 가지고 온 학생이 체육복을 도난당했을 수도 있다" 라고 나와있다. 그래서 앞뒤 체크해주기 전에 먼저 본인이 있는지 확인해주는 것이다.
3. for문을 한번 더 돌면서, lost에 있는 번호의 양 옆을 살피고, 만약 여벌을 가지고 있는 주변 학생이 있다면 remove 해준다.
> reserve에서 remove 해주는 이유는 여벌이 없어진 걸 업데이트해주는 것이다.
lost에서 remove 해주는 이유는 체육복을 도난당하고, 빌리지도 못한 학생들을 lost에 남겨두기 위함이다.
4. answer = 전체 학생 - 체육복을 잃어버리고 빌리지 못한 학생 // 계산을 해준다.
* [:]란?
> [:]는 리스트를 복제해서 그 복제 리스트로 for문을 도는 것이다. 이렇게 한 이유는, remove를 중간에 자꾸 하니까 for문이 인식을 제대로 못하더라. 잘 돌고 있었는데 중간에 뭐가 계속 빠지니까 제대로 돌아가지 않아서 [:]를 이용해 복제를 해서 잘 돌아가게 두고, remove는 원래 있던 곳에서 remove가 되도록 했다.

끝~
⭐ 느낀점
> 아이디어 자체는 잘 생각했는데, for문 돌리고 있는 리스트를 중간에 remove 해버리니까 계속 건너뛰기 하듯이 for문이 돌더라. 그거때문에 조금 고생했다. ㅠㅠ 그리고 이게 좀 예전에 푼 거라 제대로 기억은 안나는데, 아마 맨 처음에는 자기가 자기 체육복 챙겨주는 경우를 제대로 생각못했던 것 같다. 이런 문제는 경우 잘 나눠서 코딩해주면 되는 문제인데 그 부분이 조금 아쉬웠다.
'🎲 알고리즘 공부 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / Level 1] 약수의 개수와 덧셈 (파이썬) (0) | 2022.04.08 |
---|---|
[프로그래머스 / Level 1] 폰켓몬 (파이썬) (0) | 2022.04.07 |
[프로그래머스 / Level 1] K번째수 (파이썬) (0) | 2022.04.05 |
[프로그래머스 / Level 1] 완주하지 못한 선수 (파이썬) (0) | 2022.04.04 |
[프로그래머스 / Level 1] 내적 (파이썬) (0) | 2022.04.03 |