[ 백준 문제 5597 / 파이썬 ] 과제 안 내신 분..?

2023. 2. 8. 13:20백준/파이썬

 

5597번: 과제 안 내신 분..?

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

www.acmicpc.net

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

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

 

 

나의 정답:

 

방법 1)

import sys
input = sys.stdin.readline
num = []

for i in range(28):
   num.append(int(input()))

absent = []
for j in range(1, 31):
   if j not in num:
      absent.append(j)

print(min(absent))
print(max(absent))

 

num 리스트를 생성하고

첫 for문을 통해서 입력값을 28번 받아서  num list 안에 넣어줬습니다.

 

과제를 내지 않은 두 학생을 리스트에 담기 위해서

absent 리스트를 생성했습니다.

 

두번째 for문으로 인해

j에 1부터 30까지의 숫자가 대입되고

num 리스트 안에 j가 없는지 조건을 따진 뒤 num 리스트에 없다면

j를 absent 리스트에 추가 시켜줍니다.

 

for문이 끝나면 absent 리스트에 두 학생이 리스트에 담겨 있겠죠.

 

두 학생 중 출석번호가 낮은 학생, 높은 학생을 비교할 거고

모든 학생의 출석번호는 중복되지 않으니

min() , max()를 통해 최소, 최대값을 구해주는 것으로 했어요.

 

그런데 만약 min(), max()를 사용하지 않으려면 어떻게 하면 좋을지 생각해봤습니다.

 

방법2)

import sys
input = sys.stdin.readline
num = []

for i in range(28):
   num.append(int(input()))

absent = []
for j in range(1, 31):
   if j not in num:
      absent.append(j)

if absent[0] < absent[1]:
   print(absent[0])
   print(absent[1])
elif absent[0] > absent[1]:
   print(absent[1])
   print(absent[0])

 

이렇게 if문으로 absent 리스트 속 원소의 크기를 비교해서 출력해줬습니다.

근데 불편하죠..

 

방법 3)

리스트를 하나만 만드는 방법입니다.

import sys
input = sys.stdin.readline
num = [i for i in range(1,31)]

for i in range(28):
   num.remove(int(input()))

print(min(num))
print(max(num))

 

연속하는 정수로 이루어진 리스트를 만들어줄 때

리스트 컴프리헨션을 사용하면
한줄로 두 가지 일을 할 수 있습니다.

1. 리스트 생성하기
2. 원소값 채우기


num = [i for i in range(1,31)]

원래라면

num = []
for i in range(1,31):
      num.append(i)

이렇게 세 줄을 써줬을 텐데
리스트 컴프리헨션을 이용해서
한줄 안에 써줄 수 있습니다.

 

.remove()

.remove()를 사용했습니다.

 

num 리스트는 1~30에 해당하는 30개의 원소가 담긴 리스트입니다.

입력받은 28개의 값을 이 리스트 안에서 제거해주면

과제를 안 낸 학생들만이 num 리스트에 남게 됩니다.

 

그 리스트 내에서 출석번호 최대 최소값 구해서 출력해줍니다.

 

리스트 원소 삭제 세가지
del, .remove(), .pop()

1. del 명령어
del list_name[index]
리스트의 인덱스를 받아서 삭제합니다.

2. .remove()
list_name.remove(element)
인덱스가 아닌 삭제하려는 값을 받아서 삭제합니다.

3. .pop()
list_name.pop(index)
인덱스를 받아서 그 자리에 있는 원소를 꺼내줍니다.