자기계발
백준
5597 · 과제 안 내신 분..?

백준 5597번 과제 안 내신 분..?

문제

출석번호가 1번부터 30번까지인 학생 30명 중 28명이 과제를 제출했다. 제출한 학생의 출석번호가 한 줄에 하나씩 28줄 주어질 때, 제출하지 않은 두 학생의 번호를 작은 것부터 한 줄에 하나씩 출력한다. 출석번호는 중복되지 않는다.

풀이

1부터 30까지 담은 리스트를 만들고, 입력받은 번호를 28번 remove로 지운다. 남은 두 값 중 작은 것을 min, 큰 것을 max로 출력한다.

test = [num for num in range(1, 31)]
 
for i in range(1, 29):
    input_num = int(input())
    test.remove(input_num)
 
print(min(test))
print(max(test))

처음 시도한 코드

입력을 받는다는 조건이 헷갈려서, 처음에는 random.randint로 1~30 사이의 값을 직접 뽑아 28개를 채우는 방식으로 풀었다. 이 코드는 런타임 에러가 났고, 이유를 몰라 검색으로 정답 로직을 찾았다.

# 원래 시도했던 코드 (런타임 에러 발생)
test = []
 
while True:
    a = random.randint(1, 30)
    if a not in test:
        test.append(a)
        if len(test) == 28:
            break
    else:
        continue
 
for i in range(1, 31):
    if i in test:
       test.remove(i)
 
print(min(test))
print(max(test))

이 코드는 틀린 데가 두 가지다. 먼저 input()으로 주어지는 제출자 번호를 읽지 않고 임의의 번호를 만들어 쓰므로 입력과 무관한 결과가 나온다. 또 test는 제출한 28명의 번호를 담은 리스트인데 130을 돌며 그 안에 있는 값을 모두 지우므로 마지막에는 빈 리스트가 되고, 빈 리스트에 min을 쓰면 ValueError가 난다. 런타임 에러의 원인은 이쪽으로 보인다. 제출자 번호 리스트에서 지우는 게 아니라 130 전체 리스트에서 제출자를 지워야 한다.

출처