백준 5597 : 과제 안 내신 분..?(Python)

01tilinfinity·2023년 3월 11일
0

백준_5597

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

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

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

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

문제 풀이 알고리즘 설계
1) 28번 input을 받는 반복문 설계
2) 1~30 range 안에서 존재하지 않는 번호를 찾고, '과제 안 낸 학생' 리스트에 추가
3) 리스트 sort(오름차순)
4) 출력

바둑엔 기풍이 있는것처럼 프로그래머에게도 습관이 있다고 들었는데 , 나는 반복문을 지나치게 애용하는 것 같다. 시간복잡도가 높아지니 반복문 쓰는 걸 최대한 경계하는 연습을 해 보자...

Solution code

student=[]
n_student=[]
for i in range(28):
    s=int(input())
    student.append(s)
for i in range(1,31):
    if i not in student:
        n_student.append(i)
print(min(n_student))
print(max(n_student))

이 문제를 풀며 까먹었지만 새로 기억한 문법 - min,max 함수

Solution code(2)

student=[i for i in range(1,31)]
for i in range(28):
    data=int(input())
    student.remove(data)
print(min(student))
print(max(student))

코드가 거의 5줄 줄었다.
여기서 student=[i for i in range(1,31)]을 주의해야 하는데
1) 학생의 번호이기 때문에 in range(30) 으로 쓰면 0번부터 출력이라 문제와 부합x
2) 리스트의 인덱스를 부여하는 것이기 때문에 for i in range 앞에 i를 빼먹으면 안됨

오늘의 배운 점

-for문을 자제하자!
-추가하기보다, 제거하는 것이 더 효율적인 코드인 경우가 많다.
-리스트 관련 함수를 잘 숙지하자.

profile
나를 죽이지 못하는 고통은 나를 더 강하게 만든다

0개의 댓글