- 백준 1269번 풀이2023년 10월 29일
- Lv. 34 라이츄
- 작성자
- 2023.10.29.:03
문제
https://www.acmicpc.net/problem/1269
두 집합의 차집합들의 길이 합을 출력해보자
풀이
이거 풀이가 투트랙인데 둘 다 맞긴 맞았다.
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 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)