def solution(n, lost, reserve):
total = []
reserve.sort()
for i in range(1, n+1):
if i not in lost:
total.append(i)
continue
if i in reserve:
total.append(i)
reserve.remove(i)
for i in reserve:
if i-1 > 0 and (i-1 not in total):
total.append(i-1)
continue
if i<n and (i+1 not in total):
total.append(i+1)
continue
return len(total)
코드에 대한 설명은 이렇다.
reserve에는 없고, lost에만 있는 학생을 제외한 전체 학생 목록을 total에 저장한다.
reserve의 요소를 돌며 total에 없는 숫자 중, reserve와 -1 혹은, +1씩 차이나는 숫자를 total에 추가한다.
total의 원소 갯수를 return 한다.
인데, 리스트의 요소를 지우고, 생성하거나, 새로운 리스트(total)을 만드는 과정, for문을 여러번 도는 과정에서 시간이 많이 소요 되는 것 같다.
같이 문제를 풀었던 예솔님의 코드는 내 코드에 비해 실행 시간이 훨씬 짧다. 인덱스를 통한 접근. 너무 좋은 것 같다.
def solution(n, lost, reserve):
students = [1] * n # 각 인덱스-1의 번호를 가진 학생들이 가진 체육복의 갯수
reserve.sort()
for i in lost:
students[i-1] = 0 # 체육복을 잃어버렸으면
for i in reserve:
if students[i-1] == 0: # i번에 해당하는 학생이 가진 체육복이 0개이면
students[i-1] = 1 # 체육복을 하나 넘겨주고, 다음 학생으로 넘어간다.
continue
elif students[i-1] == 1: # 만약 i번에 해당하는 학생이 가진 체육복이 1개 있다면
if i > 1 and i not in lost and students[i-2] == 0:
# i가 1보다 크고, 체육복을 잃어버린 학생이 아니고(내 자신이 아니고), 내 번호 -1인 학생이 가진 체육복이 0라면,
students[i-2] = 1
# 내 번호 -1에 있는 학생에게 체육복을 1개 넘겨준다.
elif i != n and i not in lost and students[i] == 0:
# 만약 i가 마지막에 학생이 아니고 체육복을 잃어버린 학생이 아니고(내 자신이 아니고), 내 번호 +1 인 학생이 가진 체육복이 0이라면,
students[i] = 1
# 내 번호 +1에 있는 학생에게 체육복을 1개 넘겨준다.
return students.count(1) # 체육복을 가진 학생의 수를 센다.
참고해야지.
빌트인 함수 많이 사용하지 않고, 인덱스로 학생 번호를 표현했다는게 신박하다.
좋당.