barcode

백준 1269번 풀이

BOJ/[BOJ] Python

문제

https://www.acmicpc.net/problem/1269

 

1269번: 대칭 차집합

첫째 줄에 집합 A의 원소의 개수와 집합 B의 원소의 개수가 빈 칸을 사이에 두고 주어진다. 둘째 줄에는 집합 A의 모든 원소가, 셋째 줄에는 집합 B의 모든 원소가 빈 칸을 사이에 두고 각각 주어

www.acmicpc.net

두 집합의 차집합들의 길이 합을 출력해보자

 

풀이

이거 풀이가 투트랙인데 둘 다 맞긴 맞았다.

 

import sys

N, M = map(int, sys.stdin.readline().split())

set_x = set(map(int,sys.stdin.readline().split()))
set_y = set(map(int,sys.stdin.readline().split()))

일단 기본 골자인 입력 받아서 집합 만드는 건 같다. 대신 입력이 한 줄에 공백으로 나누어져 있기 때문에 map을 쓸 것이다. 그 왜 가끔 풀이에 리스트(맵(뭐시기)) 있는 그런거 말하는거다. 여기서는 리스트 말고 셋.

 

첫번째 풀이

x_y = set_x - set_y # X-Y
y_x = set_y - set_x # Y-X

일단 집합 X와 집합 Y가 있을 때, 두 집합의 차집합은 뭐에서 뭘 빼느냐에 따라 다르다. X에서 Y 뺀거랑 Y에서 X 뺀거랑은 다른거다. 즉, 차집합에 교환법칙따원 성립하지 않는다. 그니까 정직하게 쌍방 빼서 차집합을 구하면 된다.

 

import sys

N, M = map(int, sys.stdin.readline().split())

set_x = set(map(int,sys.stdin.readline().split()))
set_y = set(map(int,sys.stdin.readline().split()))

x_y = set_x - set_y # X-Y
y_x = set_y - set_x # Y-X

symmetry_cha = len(x_y) + len(y_x)

print(symmetry_cha)

그리고 차집합 길이 두개 더해서 정직하게 출력하면 된다. 끝.

 

두번째 풀이

import sys

N, M = map(int, sys.stdin.readline().split())

set_x = set(map(int,sys.stdin.readline().split()))
set_y = set(map(int,sys.stdin.readline().split()))

union_xy = set_x | set_y
intersection_xy = set_x & set_y

print(len(union_xy - intersection_xy))

벤 다이어그램 있으면 이해하기 쉬운데...

 

여기 두 집합이 있으면 이 문제에서 구해야 하는 부분이

 

여기 빨간색으로 칠한 부분이다. 그리고 

 

분홍색이 합집합이고 보라색이 교집합이다.

 

그리고 초록색 선이 우리가 문제에서 구할 부분이니까 합-교하면 되잖음.

 

둘 다 제출해서 맞긴 맞았는데, 두번째 풀이는 메모리 사용량이랑 소요시간이 첫번째 풀이에 비해 조금 더 길다. (아래가 첫번째 풀이, 위에가 두번째 풀이) 그니까 코드 길이는 두번째 풀이가 좀 더 간소하지만, 메모리 사용량이나 소요시간을 놓고 본다면 첫번째 풀이가 좀 더 효율적이라고 할 수 있다.

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 13241번 풀이  (0) 2024.02.10
백준 11478번 풀이  (0) 2023.12.10
백준 1764번 풀이  (0) 2023.10.29
백준 1934번 풀이  (0) 2023.10.19
백준 10816번 풀이  (0) 2023.08.10