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

·2024년 7월 9일
0

알고리즘 문제 풀이

목록 보기
23/105
post-thumbnail

📌 문제 : 백준 5597번



📌 문제 탐색하기

n : 출석한 학생 번호 (1 ≤ n ≤ 30)

✅ 입력 조건
1. 28번 반복해 제출자의 출석 번호 입력
✅ 출력 조건
1. 출석하지 않은 출석 번호를 오름차순으로 한 줄씩 출력

1부터 30까지 전체 학생 출석 번호를 담은 리스트를 만든다.

28번 반복해 출석 번호를 입력받아 리스트에 저장한다.

전체 출석 번호와 입력 받은 출석 번호를 for문을 돌면서 비교하고,
없는 번호를 새로운 리스트에 넣는다.

전체 출석 번호는 이미 오름차순이므로 없는 번호도 오름차순으로 저장된다.
없는 번호 리스트를 한 줄씩 출력하도록 구현한다.

가능한 시간복잡도

리스트 생성 → O(1)O(1)
for 문 → O(1)O(1)
출력 → O(1)O(1)

최종 시간복잡도
O(1)O(1)으로 제한 시간 내에 연산이 가능하다.

알고리즘 선택

for문으로 해당 출석 번호가 제출자의 출석 번호에 있는지 확인하기


📌 코드 설계하기

  1. 전체 번호 저장한 리스트 생성
  2. 출석번호 입력
  3. 결석 저장 리스트 정의
  4. 출석 확인
  5. 원하는 형식으로 출력


📌 시도 회차 수정 사항

1회차



📌 정답 코드

# 전체 번호
whole = [int(i) for i in range(1, 31)]

# 출석번호 입력
attend = [int(input()) for _ in range(28)]

# 결석 저장 리스트
absent = []

# 출석 확인
for w in whole:
    if w not in attend:
        absent.append(w)

# 원하는 형식으로 출력
for a in absent:
    print(a)
  • 결과

다른 풀이

# 전체 번호
whole = set(range(1, 31))

# 출석번호 입력
attend = set(int(input()) for _ in range(28))

# 결석 저장 리스트
absent = whole - attend

# 오름차순 정렬
absent = sorted(absent)

# 출석 확인
for a in absent:
    print(a)
  • 결과
  • set()를 통해 집합으로 만들어 사용한 풀이이다. for문 없이 -차집합을 구해서 바로 원하는 정답을 얻을 수 있었다.

📌 회고

  • 무조건 리스트로 비교하면서 푸는 방식을 떠올렸는데, set를 통해 더 깔끔하게 코드를 작성할 수 있다는 것을 알게 되었다.
  • 만약 출석한 학생들이 28명으로 고정이 아니라 따로 입력 받은 N명이었다면, 전체 시간 복잡도는 O(N)O(N)으로 동일했겠지만 원하는 결석자를 찾는 연산의 시간 복잡도가 다음과 같기 때문에 집합을 이용하는 것이 더 효율적일 것 같다.
    • 집합 이용 : O(1)O(1)
    • 리스트 이용 : O(N)O(N)

0개의 댓글

관련 채용 정보