그냥 for문으로 푸는 방식을 떠올렸는데, 분명 파이썬에는 좋은 방법이 있을 것 같아서 찾아보았다. remove를 쓰는 방법이 가장 좋은 방법인 것 같았고, 추가로 if not을 쓰는 방법도 있어서 정리해 보았당
참고로 다 예쁘게 정렬되어 있는 리스트이기에 정렬을 하거나 max/min을 굳이 사용할 필요가 없었다.
arr = [0] * 30
for i in range(28):
num = int(input())
arr[num-1] = 1
for i in range(30):
if arr[i] == 0:
print(i+1)
arr = [i for i in range(1, 31)]
for i in range(28):
num = int(input())
arr.remove(num)
print(arr[0])
print(arr[1])
arr = [0] * 30
for i in range(28):
num = int(input())
arr.append(num)
for i in range(1, 31):
if i not in arr:
print(i)
사실 위 코드는 1번과 별로 다를 것 없다. 여전히 for문을 두 번 쓰는 건데, 출석번호를 받을 때 for문을 길게 쓰는 것보다 더 좋은 방법이 있길래 아래와 같이 다시 작성해 보았다.
arr = [int(input()) for _ in range(28)]
for i in range(1, 31):
if i not in arr:
print(i)

아래서부터 1~3번까지 작성한 코드이다.
넷 다 for문을 두 번 쓰는 건 같기에 역시 별 차이는 없다.
코드 길이랑 성능이 상관이 없다는 걸 다시 한번 알게 되었다.
3번의 두 코드의 길이는 확연히 차이나지만 오히려 짧은 게 조금 더 시간이 걸렸기 때문이다.
아무튼 remove라는 메소드를 알아 간 문제였다!