[백준] 22233 가희와 키워드 - python

이윤진·2023년 8월 21일
0

알고리즘 연습

목록 보기
10/24

백준 22233 가희와 키워드 [링크]

문제

가희는 블로그를 운영하고 있습니다. 가희는 블로그에 글을 쓰기 위해, 메모장에 키워드를 적곤 합니다.

지금까지 메모장에 써진 키워드는 모두 서로 다르며, 총 N개가 존재합니다.

가희는 새로운 글을 작성할 때, 최대 10개의 키워드에 대해서 글을 작성합니다.

이 키워드들 중에 메모장에 있었던 키워드는 가희가 글을 쓴 이후, 메모장에서 지워지게 됩니다.

가희는 블로그에 글을 쓰고 나서, 메모장에 있는 키워드 개수가 몇 개인지 알고 싶습니다. 가희를 도와주세요.

입력

첫 번째 줄에 가희가 메모장에 적은 키워드 개수 N, 가희가 블로그에 쓴 글의 개수 M이 공백으로 구분해서 주어집니다.

2번째 줄부터 N+1번째 줄까지 메모장에 적은 키워드 N개가 주어집니다.

N+2번째 줄부터 N+M+1번째 줄까지, 가희가 쓴 글과 관련된 키워드가 , (쉼표)로 구분해서 주어집니다. 공백으로 구분되지 않음을 유의해 주세요.

출력

x번째 줄에는 x번째 글을 쓰고 난 후에 메모장에 남아 있는 키워드의 개수를 출력해 주세요.

문제 해결 아이디어

  1. 먼저 이걸 set으로 만들어서 차집합을 구하고, 길이를 출력하면 될 것이라고 생각했다.
    -> 그러나...시간 초과가 발생했다...
    (list는 분명 초과날 거라고 생각해서 set으로 했는데도 왜...)
  2. 다른 방법을 찾아봤는데 대부분 이걸 dictionary로 푸신 것을 봤다.
    -> list와 set의 연산 시간 비교에 대해서는 알고 있었는데 dictionary는 내가 잘 몰랐다.
    https://lsh424.tistory.com/59
    이 분의 글을 보면 set의 차집합을 구하는 것보다 dictionary로 접근하는 것이 시간 복잡도가 더 작다. 따라서 딕셔너리로 구현하여보았다.

코드

# 가희와 키워드
import sys

key_n, post_n = map(int, sys.stdin.readline().split(' '))

memo = {}
answer = 0

for _ in range(key_n):
    memo[sys.stdin.readline().rstrip()] = 1
    answer += 1

for _ in range(post_n):
    post = list(sys.stdin.readline().rstrip().split(','))
    for i in post:
        if i in memo.keys():
            if memo[i] == 1:
                memo[i] = 0
                answer -= 1
    print(answer)

set으로 푼 코드

# 가희와 키워드
import sys

key_n, post_n = map(int, sys.stdin.readline().split(' '))

memo = []
answer = []

for _ in range(key_n):
 memo.append(sys.stdin.readline().rstrip())

memo = set(memo)
for _ in range(post_n):
 post = list(sys.stdin.readline().rstrip().split(','))
 memo = memo - set(post)
 print(len(memo))

솔직히 for 문 안에 for 문을 만드는 것이 시간이 더 걸릴 것이라고 생각했다.
set으로 풀었을 시, O(len(memo)+len(post)) post_n 시간이 걸리고
dictionary로 풀었을 시, O(1)
len(post) * post_n 이기 때문에 딕셔너리가 더 빨랐다. 이 부분도 잘 기억해둬야 겠다.

profile
Android/Flutter 개발

0개의 댓글