문제 : https://school.programmers.co.kr/learn/courses/30/lessons/42862
- 먼저 인원수(n)만큼 리스트를 0으로 초기화
- lost의 경우 -1로 표기, reserve일 경우 1을 더해준다.
-> lost, reserve 둘 다 해당할 경우 0으로 표기해야 하기 때문- 체육복을 빌려줬다면 1 -> 0, 체육복을 받았다면 -1 -> 0으로 표기
- 전부 돌면서 가능한 사람한테만 체육복을 빌려준 후 리스트에서 1과 0의 개수를 센다.
def solution(n, lost, reserve):
li = [0] * n
for i in lost:
li[i-1] = -1
for i in reserve:
li[i-1] = li[i-1]+1
for i in range(len(li)):
if(li[i] == -1):
if(i == 0 and li[i+1] == 1): # 첫번째 사람이 체육복이 없는데 그 다음사람이 빌려줄 수 있는 경우
li[i+1] = 0
li[i] = 0
elif(i == n-1 and li[i-1] == 1): # 마지막 사람이 체육복이 없는데 그 이전 사람이 빌려줄 수 있는 경우
li[i-1] = 0
li[i] = 0
elif(i != 0 and i != n-1): # 처음 마지막 x, 중간사람
if(li[i-1] == 0 and li[i+1] == 0):
continue # 왼쪽 오른쪽 둘 다 못 빌려주면 그냥 넘어간다
elif(li[i-1] == 1 and li[i+1] == 1): # 왼쪽 오른쪽 둘 다 빌려줄 수 있다면 왼쪽 사람거를 우선으로 받는다
li[i-1] = 0
li[i] = 0
elif(li[i-1] == 1): # 왼쪽만 빌려줄 수 있는 경우
li[i-1] = 0
li[i] = 0
elif(li[i+1] == 1): # 오른쪽만 빌려 줄 수 있는 경우
li[i+1] = 0
li[i] = 0
answer = 0
for stu in li:
if(stu == 0 or stu == 1):
answer += 1
return answer
보기만 해도 노가다를 했다는게 보인다. 바로 모범답안을 보도록 하자
def solution(n, lost, reserve):
_reserve = [r for r in reserve if r not in lost]
_lost = [l for l in lost if l not in reserve]
for r in _reserve:
f = r - 1
b = r + 1
if f in _lost:
_lost.remove(f)
elif b in _lost:
_lost.remove(b)
return n - len(_lost)