Algorithm/코딩테스트 (Python)

[백준][22233번] 가희와 키워드

싱브이 2024. 1. 2. 21:40
728x90
반응형

문제

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

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

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

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

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

 

 

 

 

 

내 생각

역대급으로 시간초과와 싸운 문제 ;;; 결국 이겨냈지만 찝찝했다. 왜냐면 답은 input방식이었기 때문,,

혹시 몰라서 틀렸다고 나온 코드도 input방식을 readline으로 바꾸니 정답이 되어버렸지 모야 

프로그래머스에선 input()으로도 잘풀렸는데 백준은 역시 readline()인가보다 !

 

아무튼 문제를 요약하면 가희가 메모장에 적은 키워드와 블로그 글에 등장한 키워드를 제거하고 남아 있는 키워드의 개수를 출력해야한다.

딕셔너리를 사용하였다. (memo = {}) 딕셔너리의 역할은 메모장에 적은 키워드, 그리고 키워드의 등장 여부를 1과 0으로 저장

그리고 answer을 이용하여 메모장에 남아 있는 키워드를 계산하였다.

 

주석에 자세하게 설명되어 있음!

 

 

 

 

 

내 코드

1. 정답 (1)

import sys

# 메모장에 적은 키워드의 수(N)와 가희가 블로그에 쓴 글의 수(M)를 입력
N, M = map(int, input().split())
# 메모장에 있는 키워드를 저장하는 딕셔너리
memo = {}
# 남아 있는 키워드의 개수 (처음에는 모두 남아있으므로 N)
answer = N

# 메모장에 적은 키워드를 입력받아 memo에 1로 표시
for _ in range(N):
    memo[sys.stdin.readline().rstrip()] = 1

# 블로그에 쓴 글의 수에 대해 
for _ in range(M):
	# 글에 등장한 키워드들을 콤마로 구분
    post = sys.stdin.readline().rstrip().split(',')
    for keyword in post:
    	# 현재 키워드가 메모장에 있고 and 이미 사용되지 않은 키워드라면
        if keyword in memo and memo[keyword] == 1:
        	# 현재 키워드를 사용했음
            memo[keyword] = 0
            # 남아 있는 키워드의 개수 - 1
            answer -= 1
    print(answer)

 

2. 정답 (2)

import sys

# 가희가 메모장에 적은 키워드의 수(N)와 가희가 블로그에 쓴 글의 수(M)
N, M = map(int, input().split())
# 메모장에 적은 키워드들을 set으로 저장
notes = set(sys.stdin.readline().strip() for _ in range(N))
# 남아 있는 키워드를 위한 set : 초기에는 메모장에 있는 모든 키워드가 남아 있는 상태
keywords = set(notes)


for i in range(N+2, N+M+2):
	# 블로그 글에 등장한 키워드들을 콤마(,)로 구분하여 set으로 저장
    post = set(sys.stdin.readline().strip().split(","))
    # 현재 남아 있는 키워드에서 글에 있는 키워드를 제거
    keywords -= post

    print(len(keywords))

 

3. 시간 초과(1)

N, M = map(int, input().split())
notes = set(input().strip() for _ in range(N))
keywords = set(notes)


for i in range(N+2, N+M+2):
    post = set(input().strip().split(","))
    keywords -= post

    print(len(keywords))

 

4. 시간 초과(2)

N, M = map(int, input().split())
notes = set(input().strip() for _ in range(N))
keywords = dict.fromkeys(notes, 1)


for i in range(N+2, N+M+2):
    post = set(input().strip().split(","))
    for keyword in post:
        if keyword in keywords:
            del keywords[keyword]

    print(len(keywords))

 

5. 시간 초과(3)

N, M = map(int, input().split())
memo = {}
answer = N

for _ in range(N):
    memo[input().rstrip()] = 1

for _ in range(M):
    post = input().rstrip().split(',')
    for keyword in post:
        if keyword in memo and memo[keyword] == 1:
            memo[keyword] = 0
            answer -= 1
    print(answer)
728x90
반응형