Algorithm/Sorting

[백준 1764번] 듣보잡 ( + input과 sys.stdin.readline의 차이점)

킹우현 2023. 2. 23. 17:13

import sys
input = sys.stdin.readline

n, m = map(int,input().split())

list_n = []
list_m = []

count = 0
count_list = []

for i in range(n):
  list_n.append(input().rstrip())

for i in range(m):
  list_m.append(input().rstrip())

set_n = set(list_n)
set_m = set(list_m)

for i in set_m:
  if i in set_n:
    count += 1
    count_list.append(i)

count_list.sort()

print(count)
for i in count_list:
  print(i)

이번 문제는 두 개의 명단에서 두 명단 모두에 속한 사람을 찾아내는 문제였다.

 

문제 자체의 난이도는 쉬운 편이었지만, 본인은 듣도 못한 사람들과 보도 못한 사람들 모두 명단에 중복된 사람이 없다는 조건을 보고나서 최대한 시간복잡도를 줄이기 위하여 집합(Set) 자료형을 사용하였다.

 

그리고, 이번 문제를 통해 알게 된 사실이 한가지 있는데, 입력을 받을 때 입력 값이 개수가 많거나 시간 초과와 같은 문제를 해결하기 위해 input() 함수 대신에 sys.stdin.readline()을 사용한다는 사실을 알고 있었지만 이 둘의 정확한 차이는 잘 모르고 있었다.

 

하지만 sys.stdin.readline()을 사용하여 문자열 리스트를 입력받다보니 뒤에 줄 바꿈 문자(\n)가 붙어 문제 제출 시에 출력값 문제가 발생했다.

 

input()과 sys.stdin.readline()의 차이점을 검색해본 결과 다음과 같이 정리할 수 있었다.

1. 속도 측면에서는 input() 보다는 sys.stdin.readline()을 사용하는 것이 더 빠르다.
2. 종종 입력 값에서 prompt message가 필요 없는 BOJ에서 시간 초과 문제가 발생할 경우 sys.stdin.readline()을 사용하면 시간 초과 문제를 해결할 수 있다.
3. input()은 내장 함수로써 파라미터로 prompt message을 받아서 사용할 수 있으며, 입력받은 값의 개행 문자를 삭제시켜 반환한다. 하지만 sys.stdin.readline()는 prompt message을 파라미터로 받지 않으며, 개행 문자를 포함하여 반환한다.

 

따라서 sys.stdin.readline()을 사용해서 문자열을 입력받을 때는 .rstrip() 함수를 사용하여 뒤에 개행 문자(\n)를 제거해주어야 한다 :)

 

 

'Algorithm > Sorting' 카테고리의 다른 글

[백준 2587번] 대표값2  (0) 2023.02.24
[백준 18870번] 좌표 압축  (0) 2023.02.23
[백준 2309번] 일곱 난쟁이  (0) 2023.02.22
[백준 11651번] 좌표 정렬하기 2  (0) 2023.02.21
[백준 10814번] 나이순 정렬  (0) 2023.02.21