백준

백준 5597번

rabbit-jun 2025. 1. 23. 13:28

문제

X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다.

교수님이 내준 특별과제를 28명이 제출했는데, 그 중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오.

입력

입력은 총 28줄로 각 제출자(학생)의 출석번호 n(1 ≤ n ≤ 30)가 한 줄에 하나씩 주어진다. 출석번호에 중복은 없다.

출력

출력은 2줄이다. 1번째 줄엔 제출하지 않은 학생의 출석번호 중 가장 작은 것을 출력하고, 2번째 줄에선 그 다음 출석번호를 출력한다.

import sys

basket=[i+1 for i in range(30)]

for _ in range(28):
    number = int(sys.stdin.readline())
    basket.pop(basket.index(number))

print(*basket, sep='\n')

리스트에서 해당하는 값을 빼고 남은걸 출력한다는 생각
이와중에 pop(i)에서 i번째 값을 빼는걸 망각해서 한번 헤맸다.

l=[*{*range(1,31)}-{*map(int,open(0))}]
for i in sorted(l): print(i)

이게 제일 best인듯 하다.
*map(int,open(0))는 입력값을 읽어들여서 map 객체를 만들었는데, 이걸 *로 언패킹해준다.
{}로 감싸서 집합으로 만들어준다.
*range(1,31) 이것도 1부터 30까지 range 객체를 만들어 주고 언패킹
그후 {}로 감싸서 집합으로 만들어 주면 *map(int,open(0))와 차집합이 가능해진다.
그리고 그걸 다시 *로 언패킹

그 후 sorted()를 이용하여 정렬된 값을 i로 받아 출력한다.

list.sort() : 리스트 자체를 정렬하고 반환값은 None, 이게 헷갈렸는데 l=[4,1] 을 sort()하면 l=[4,1]이 되지만 l.sort()의 값은 None이 된다.
'이것은 명확하게 표현하는게 암묵적인것보다 낫다'라는 파이썬의 철학에 따라 이 메서드는 리스트 자체를 정렬하는 거임이라고 표현하는 것
sorted()는 정렬된 값을 반환한다.

print(*sorted([*{*range(1,31)}-{*map(int,open(0))}]))최고의 대답은 이게 아닐까 싶다.
집합은 순서가 없기때문에 정렬을 해줘야함

a=[]
for i in range(28):
    a.append(int(input()))
for i in range(1,31):
    if i not in a:
        print(i)

이건 보통 사람이 많이 생각하는 답인듯 하다.
빈 배열에 값을 넣어서 추가하고 range로 일정 범위만큼 반복하면서 a에 속하지 않은 i가 있으면 출력한다.
1부터 시작하니 당연히 작은 수가 먼저 나올것이고 정렬이 필요없다.

주요 차이점 비교

특징 input() open(0) sys.stdin.readline()
반환값 문자열 파일 객체 문자열
개행 처리 자동 제거 제거하지 않음 제거하지 않음
성능 상대적으로 느림 빠름 빠름
사용 방법 간단한 입력 처리 대량 데이터 처리 적합 대량 데이터 처리 적합
주요 용도 간단한 사용자 입력 처리 파일처럼 표준 입력 처리 많은 줄 입력을 처리할 때
반응형