https://programmers.co.kr/learn/courses/30/lessons/42862
- 길이가 n이고 값이 1인 리스트 생성 (s)
- 체육복을 도난당했으면 s에서 도난당한 학생 번호 값 - 1
- 여분의 체육복이 있으면 학생 번호 값 + 1
ex) n = 5, lost = [2, 4], reserve = [1, 3, 5]
- 2 주변에 0이 있으면 2 -> 1, 0 -> 1로 변경
- s 전체 길이에서 0의 개수를 뺀 값 리턴
def solution(n, lost, reserve):
#길이=n, 값=1인 배열 생성
s = [1 for i in range(n)]
#체육복 도난
for i in lost:
s[i - 1] -= 1
#체육복 여분
for i in reserve:
s[i - 1] += 1
#체육복 빌려주기
for i in range(len(s)):
left = i - 1
right = i + 1
if left >= 0:
if s[i] == 2 and s[left] == 0:
s[i - 1] += 1
s[i] -= 1
elif right <= len(s):
if s[i] == 2 and s[right] == 0:
s[i + 1] += 1
s[i] -= 1
#체육복 있는 학생 최대값 return
return len(s) - s.count(0)
약 40%의 테스트 케이스를 통과하지 못함.
처음 접근 방식으로 더 풀기에는 아직 내 실력이 받쳐주지 못해 접근 방식부터 수정해서 코드를 작성하기로 결정.
- 도난 당한 학생 번호 리스트와 여분 체육복 갖고있는 학생의 번호 리스트를 생성
-> 새로 생성하는 이유 : 2개의 체육복을 갖고 있는 학생이 1개를 도난당하면 1개만 남음. 즉 중복 제거를 해주면 불필요한 연산이 필요 없게 됨- 도난 당한 번호의 +-1의 번호에서 여분의 체육복을 갖고 있으면 여분 체육복 리스트에서 삭제하고 리턴 값 += 1
def solution(n, lost, reserve):
lost_s = list(set(lost) - set(reserve))
reserve_s = list(set(reserve) - set(lost))
result = n - len(lost_s)
for i in lost_s:
if i - 1 in reserve_s:
result += 1
reserve_s.remove(i - 1)
elif i + 1 in reserve_s:
result += 1
reserve_s.remove(i + 1)
return result
알고리즘에 대해 아무것도 모르고 무작정 풀려고만 하니 슬슬 밑천이 드러나는 것 같다. 프로그래머스 lv.1 만 올클리어 하고 알고리즘에 대해 공부해야 할 것 같다.