연습장
7. 체육복 본문
n - 전체 학생수
lost - 체육복이 없다.
reserve - 체육복이 여벌이 있다.
return - 체육 수업을 듣는 학생 수
특이한 점으론 lost 와 reserve 가 같게 되면 빌리거나 빌려줄 수 없다는 점이다.
즉 lost 와 reserve 의 원소가 겹치면 양쪽 배열에서 지워버리는게 좋은 해결 방법이 될 걸로 예상
1. lost 와 reserve 에 중복되는 원소 확인 및 처리
2. lost 에서 1을 빼거나 1을 더했을때 reserve 에 해당 숫자가 있어야 빌릴 수 있음
3. 빌리고 나서는 더 빌리면안됨. [3] 이 [2,4] 에게 각각 빌리면 2번 빌리는 경우가 나올 수 있음.
def solution(n, lost, reserve):
answer = 0
num = 0 # 체육복을 빌린 사람 수
# 1. 중복되는 원소 확인
for i in lost:
if i in reserve:
lost.remove(i)
reserve.remove(i)
# 2. 빌려줄사람 찾기
for i in lost: # 없는 사람 중에서
# 앞사람이 여분이 있는지?
if i-1 in reserve:
num +=1 # 사실 lost.remove(i) 로 진행하였는데, 그렇게 되면 lost 의 원소가 줄어서 for 문이 돌지 않는다.
reserve.remove(i-1)
# 뒷사람이 여분이 있는지?
elif i+1 in reserve:
num +=1
reserve.remove(i+1)
answer = n - len(lost) + num
return answer
오류가 났다. 예외가 있다고 한다.
n = 2 일 경우에 대해서 테스트 케이스를 넣어 처리해봤다 -> 이상이없는거같다.
앞사람에게 우선으로 빌리도록 하여서 오류가 났을까..
lost.sort() 구문을 넣었더니 2개의 테스트 케이스의 오류를 해결하였다.
잃어버린 사람의 순서가 정렬되어 있지 않았던 것 같다.
# lost 정렬하여 앞사람부터 빌리도록하는 이유는 다음과 같다.
만약 lost 순서가 틀어지게 되면 위의 그림처럼 빌려가서 예외가 발생하기 때문에 방향을 일정하게 해주어야 한다.
num +=1 # 사실 lost.remove(i) 로 진행하였는데, 그렇게 되면 lost 의 원소가 줄어서 for 문이 돌지 않는다. 라고 했었는데 마찬가지로 -> 지우는 과정에서 오류가 났을것 같다. -> 지워야되는 원소목록을 만들어서 따로 1-1 에서 지우도록 하였다.
def solution(n, lost, reserve):
answer = 0
num = 0
del_list = []
# 1. 지울 리스트 만들기
for i in lost:
if i in reserve:
del_list.append(i)
# 1-1 지우기
for i in del_list:
lost.remove(i)
reserve.remove(i)
# lost 정렬하여 앞사람부터 빌리도록함
lost.sort()
# 2. 빌려줄사람 찾기
for i in lost:
# 앞사람이 여분이 있는지?
if i-1 in reserve:
num +=1
reserve.remove(i-1)
# 뒷사람이 여분이 있는지?
elif i+1 in reserve:
num +=1
reserve.remove(i+1)
answer = n - len(lost) + num
return answer
'프로그래머스 > 1단계' 카테고리의 다른 글
9. 완주하지 못한 선수 (0) | 2023.12.14 |
---|---|
8. 문자열 나누기 (0) | 2023.12.12 |
6. 숫자 짝궁 (0) | 2023.12.12 |
5. 로또의 최고 순위와 최저 순위 (0) | 2023.12.11 |
4. 옹알이2 (0) | 2023.12.11 |