[프로그래머스 lv.1] 체육복
문제
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
<제한사항>
- 전체 학생의 수는 2명 이상 30명 이하입니다.
- 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
- 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
내가 생각한 풀이 방법
학생들 체육복 현황
새로운 리스트 pe_uni (Physical Education uniform)를 생성하여 n만큼 1을 넣어준다
lost의 길이만큼 for문을 돌며 lost내의 요소를 인덱스로 가진 학생에게 -1
reserve의 길이 만큼 for문을 돌며 reserve 내의 요소를 인덱스로 가진 학생에게 +1
체육복 빌려주기
n 만큼 for문을 돌면서
만약 해당 학생의 체육복 현황이 0라면
만약 앞 학생의 체육복이 2라면 앞 학생 -1 해당 학생 +1
만약 뒤 학생의 체육복이 2라면 뒤 학생 -1 해당 학생 +1
수업을 들을 수 있는 학생들
for문을 돌면서 0이 아닌 학생만 answer += 1
코드로 구현
1차 시도
def solution(n, lost, reserve):
answer = 0
pe_uni = []
# 도난 이후 학생들 체육복 현황
pe_uni[1] * n
for i in range(len(lost)):
pe_uni[lost[i]] -= 1
for i in range(len(reserve)):
pe_uni[reserve[i]] += 1
# 체육복 빌려주기
for i in range(n):
if pe_uni[i] == 0:
if pe_uni[i-1] == 2:
pe_uni[i-1] -= 1
pe_uni[i] += 1
elif pe_uni[i+1] == 2:
pe_uni[i+1] -= 1
pe_uni[i] += 1
# 수업을 들을 수 있는 학생들
for i in range(n):
if pe_uni[i] != 0:
answer += 1
return answer
→ 아무래도 체육복 빌려주기 쪽에서 문제가 생긴 듯 하다
- 1번은 2번에게만 n번은 n-1번에게만 받을 수 있다는 조건을 추가해줘야하나?
2차 시도
def solution(n, lost, reserve):
answer = 0
pe_uni = []
# 도난 이후 학생들 체육복 현황
pe_uni[1] * n
for i in range(len(lost)):
pe_uni[lost[i]] -= 1
for i in range(len(reserve)):
pe_uni[reserve[i]] += 1
# 체육복 빌려주기
for i in range(n):
if pe_uni[0] == 0:
if pe_uni[1] == 2:
pe_uni[1] -= 1
pe_uni[0] += 1
if pe_uni[n-1] == 0:
if pe_uni[n-2] == 2:
pe_uni[n-2] -= 1
pe_uni[n-1] += 1
if pe_uni[i] == 0:
if pe_uni[i-1] == 2:
pe_uni[i-1] -= 1
pe_uni[i] += 1
elif pe_uni[i+1] == 2:
pe_uni[i+1] -= 1
pe_uni[i] += 1
# 수업을 들을 수 있는 학생들
for i in range(n):
if pe_uni[i] != 0:
answer += 1
return answer
3차 시도
def solution(n, lost, reserve):
answer = 0
pe_uni = []
# 도난 이후 학생들 체육복 현황
pe_uni = [1] * n
for i in range(len(lost)):
pe_uni[lost[i]-1] -= 1
for i in range(len(reserve)):
pe_uni[reserve[i]-1] += 1
# 체육복 빌려주기
if pe_uni[0] == 0:
if pe_uni[1] == 2:
pe_uni[1] -= 1
pe_uni[0] += 1
if pe_uni[n-1] == 0:
if pe_uni[n-2] == 2:
pe_uni[n-2] -= 1
pe_uni[n-1] += 1
for i in range(1, n-1):
if pe_uni[i] == 0:
if pe_uni[i-1] == 2:
pe_uni[i-1] -= 1
pe_uni[i] += 1
elif pe_uni[i+1] == 2:
pe_uni[i+1] -= 1
pe_uni[i] += 1
# 수업을 들을 수 있는 학생들
for i in range(n):
if pe_uni[i] != 0:
answer += 1
return answer
- pe_uni 초기화 코드 실수
- 인덱스가 0부터 시작하는 것을 고려할 때 lost에 있는 학생 번호 -1을 해준 것을 넣어줘야 함
- 1번 학생과 마지막 학생에 대한 조건을 for문 밖으로 빼주고 for문 범위를 조정해줌
다른 사람 풀이
greedy를 활용해야했어서 다른 사람들 풀이 꼭 찾아보기..!