1764번: 듣보잡
첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다.
www.acmicpc.net
김진영이 듣도 못한 사람의 명단과, 보도 못한 사람의 명단이 주어질 때, 듣도 보도 못한 사람의 명단을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. 이름은 띄어쓰기 없이 알파벳 소문자로만 이루어지며, 그 길이는 20 이하이다. N, M은 500,000 이하의 자연수이다.
듣도 못한 사람의 명단에는 중복되는 이름이 없으며, 보도 못한 사람의 명단도 마찬가지이다.
출력
듣보잡의 수와 그 명단을 사전순으로 출력한다.
코드
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
a = set()
b = set()
for _ in range(n):
a.add(input().strip())
for _ in range(m):
b.add(input().strip())
c = a.intersection(b)
sorted_list = sorted(c)
print(len(sorted_list))
for name in sorted_list:
print(name)
집합을 이용해서 쉽게 구현했다.
뒤에 정리하겠지만 구현은 쉽게 해놓고 자질구레하게 여러 군데에서 틀렸다..ㅜ
파이썬에서 집합(set)은 고유한 원소들의 모음이다.
집합은 중복된 원소를 허용하지 않으며, 순서가 없다.
집합은 원소들 간의 유일성을 보장하고, 집합연산을 쉽게 수행할 수 있다.
union(), intersection(), difference() -> 합집합, 교집합, 차집합
add(), remove(), discard() -> 원소를 추가하거나 제거
오류
1. 문제를 제대로 읽자
- 출력할 때 명단을 사전순으로 출력하라는 조건을 놓쳤다.
2. sorted()
처음에 정렬문을 sorted(c) 이렇게만 썼다.
sorted() 함수는 리스트나 반복 가능한(iterable) 객체의 요소들을 정렬한 새로운 리스트를 반환한다.
원본 리스트를 변경하는 것이 아니라 새로운 정렬된 리스트를 반환하는 것이기 때문에
sorted(c)를 썼더라도 c 집합이 정렬되지 않은 채로 출력된다.
따라서 정렬된 결과를 출력하기 위해서는 sorted() 함수의 반환 값을 다시 변수에 할당해야 한다.
sorted_list = sorted(c)
이번 문제에서는 해당되지 않지만,
정렬된 리스트를 원본 집합에 저장하려면 정렬된 리스트를 다시 집합으로 변환해야 한다.
여기서 집합은 중복된 요소를 허용하지 않으므로 정렬된 리스트를 집합으로 변환하면 중복된 요소가 제거될 수 있으니 주의해야 한다.
3. 출력 형식 오류
집합에 입력값을 추가하는 문장을 a.add(input()) 으로만 썼더니
출력될 때 문장들 사이에 공백 문장이 추가되는 오류가 떴다.
입력으로 받은 문자열에는 여전히 개행문자('\n')가 포함되어 있다.
그래서 출력할 때도 빈 문장이 같이 출력된 것
'.strip()' : 문자열의 양 끝에 있는 공백과 개행 문자 등을 제거한다.
'.rstrip()' : 오른쪽 끝에 있는 개행 문자를 제거한다.
'Algorithm' 카테고리의 다른 글
| [백준] 11723 집합 / python (0) | 2024.04.22 |
|---|---|
| [백준] 2630 색종이 만들기 / python (2) | 2024.04.22 |
| [백준] 1927 최소 힙 / python (0) | 2024.04.19 |
| [백준] 2579 계단 오르기 / python (1) | 2024.04.19 |
| [백준] 1254 팰린드롬 만들기 / python (0) | 2024.04.19 |