문제
https://school.programmers.co.kr/learn/courses/30/lessons/42862
풀이
일단 지문을 먼저 읽고, 아래 계획을 세우고 코드를 작성하였다.
def solution(n, lost, reserve):
# n 명중에서 잃어버린 인원수를 뺍니다.
n = n - len(lost)
# 여유분을 들고있는 학생의 리스트를 reserve_student 라고 정합니다.
reserve_student = reserve.copy()
"""
체육복이 없는 인원을 순회하면서 여유분을 들고있는 학생이 앞뒤에 있다면,
그 친구 체육복을 가져옵니다.
"""
for person in lost:
if person - 1 in reserve_student:
reserve_student.remove(person - 1)
n += 1
elif person + 1 in reserve_student:
reserve_student.remove(person + 1)
n += 1
return n
그런데 테스트 케이스는 성공했는데, 본 케이스에서 몇 가지가 틀려서, 예외 사항이 있나 싶었는데 다음 구문에서 예외사항을 처리하지 못했다.
" 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 다른 학생에게 체육복을 빌려 줄 수 없습니다. "
이 말은 즉, 여유 분을 들고 있으면서 도난당한 사람의 리스트에도 있을 수 있다는 것이다. 즉 이런 인원의 중복을 제거해야 하는데 그 이유는 여유 분을 들고 있으면서 도난을 당했다면, 옷을 빌려 줄 수 없기 때문이다. 이를 고려하여 코드를 작성하면 다음과 같다.
def solution(n, lost, reserve):
# 잃어버렸으면서, 여유분을 들고 있는 인원을 중복 제거 해준다.
duplication = set(lost)&set(reserve)
reserve_student = list(set(reserve)-duplication)
lost = list(set(lost)-duplication)
n = n - len(lost)
for person in lost:
if person - 1 in reserve_student:
reserve_student.remove(person - 1)
n += 1
elif person + 1 in reserve_student:
reserve_student.remove(person + 1)
n += 1
return n
'Algorithm > Programmers' 카테고리의 다른 글
프로그래머스 LV1 옹알이2 (0) | 2023.05.05 |
---|---|
프로그래머스 LV1 키패드 누르기 (0) | 2023.05.05 |
프로그래머스 LV1 두 개 뽑아서 더하기 (0) | 2023.05.04 |
프로그래머스 LV1 덧칠하기 (0) | 2023.04.28 |
프로그래머스 LV1 추억점수 (0) | 2023.04.27 |