문제

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)

여유분이 있는 학생 목록과 도난당한 학생목록을 깔끔하게 전처리한 코드
덕분에 한 번의 반복문으로 처리가 끝난다.
전처리를 잘 할수록 더 짧고 쉽고 보기좋은 코드가 되는 것 같다.

댓글남기기