문제
https://programmers.co.kr/learn/courses/30/lessons/42862?language=python3
풀이
def solution(n, lost, reserve):
ht = {}
for i in range(1, n+1):
ht[i] = 1
if i in lost :
ht[i] -= 1
if i in reserve :
ht[i] += 1
for i in range(2, n):
if ht[i] == 0 and ht[i-1] > 1 :
ht[i] += 1
ht[i-1] -= 1
if ht[i] == 0 and ht[i+1] > 1 :
ht[i] += 1
ht[i+1] -= 1
return len([i for i in ht.values() if i > 0])
최초 수행 코드
테스트 1 〉 통과 (0.02ms, 10.3MB)
테스트 2 〉 통과 (0.03ms, 10.3MB)
테스트 3 〉 통과 (0.03ms, 10.3MB)
테스트 4 〉 통과 (0.02ms, 10.2MB)
테스트 5 〉 통과 (0.03ms, 10.2MB)
테스트 6 〉 통과 (0.01ms, 10.3MB)
테스트 7 〉 통과 (0.03ms, 10.3MB)
테스트 8 〉 통과 (0.02ms, 10.3MB)
테스트 9 〉 통과 (0.02ms, 10.1MB)
테스트 10 〉 통과 (0.03ms, 10.2MB)
테스트 11 〉 실패 (0.01ms, 10.2MB)
테스트 12 〉 통과 (0.01ms, 10.3MB)
테스트케이스 11번에 걸린다.
두 번째 루프를 곰곰히 살펴보니 맨 앞과 맨 뒤 학생은
체육복이 있는지 없는지에 확인을 못 받는다.
바보같긴!
def solution(n, lost, reserve):
ht = {}
for i in range(1, n+1):
ht[i] = 1
if i in lost :
ht[i] -= 1
if i in reserve :
ht[i] += 1
for i in range(1, n+1):
if i > 1 and ht[i] == 0 and ht[i-1] > 1 :
ht[i] += 1
ht[i-1] -= 1
if i < n and ht[i] == 0 and ht[i+1] > 1 :
ht[i] += 1
ht[i+1] -= 1
return len([i for i in ht.values() if i > 0])
잘된다!
더 나은 풀이
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)
여유분이 있는 학생 목록과 도난당한 학생목록을 깔끔하게 전처리한 코드
덕분에 한 번의 반복문으로 처리가 끝난다.
전처리를 잘 할수록 더 짧고 쉽고 보기좋은 코드가 되는 것 같다.
댓글남기기