백준 5597번
문제
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() |
---|---|---|---|
반환값 | 문자열 | 파일 객체 | 문자열 |
개행 처리 | 자동 제거 | 제거하지 않음 | 제거하지 않음 |
성능 | 상대적으로 느림 | 빠름 | 빠름 |
사용 방법 | 간단한 입력 처리 | 대량 데이터 처리 적합 | 대량 데이터 처리 적합 |
주요 용도 | 간단한 사용자 입력 처리 | 파일처럼 표준 입력 처리 | 많은 줄 입력을 처리할 때 |