Algorithm Problems

[백준][Python] 3078번 좋은 단어 - 큐

WakaraNai 2021. 6. 6. 10:56
728x90
반응형

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

 

3078번: 좋은 친구

첫째 줄에 N과 K가 주어진다. (3 ≤ N ≤ 300,000, 1 ≤ K ≤ N) 다음 N개 줄에는 상근이네 반 학생의 이름이 성적순으로 주어진다. 이름은 알파벳 대문자로 이루어져 있고, 2글자 ~ 20글자이다.

www.acmicpc.net

 

 

Hint

이름 길이 별로 큐를 생성

 

Python

import sys
n, k = map(int, sys.stdin.readline().split())
#arr = [ sys.stdin.readline().rstrip() for _ in range(n) ] #성적 순

# 규칙 : 반 등수의 차이가 자신과 K가 넘으면 친구가 아니다
# 좋은 친구 : 친구 중에서 이름의 길이가 같은 친구

# 이름 길이 별로 큐를 생성
arr = [[] for _ in range(21)]

cnt = 0 
for i in range(n):
    name = sys.stdin.readline().rstrip()
    
    while arr[len(name)] and abs(arr[len(name)][0]-i)>k:
        del arr[len(name)][0]
        
    cnt += len(arr[len(name)])
    arr[len(name)].append(i)
    
print(cnt)

 

 

 

시간 초과

k의 길이가 커질 수록 오래 걸린다는 단점

import sys
n, k = map(int, sys.stdin.readline().split())
arr = [ sys.stdin.readline().rstrip() for _ in range(n) ] #성적 순

# 규칙 : 반 등수의 차이가 자신과 K가 넘으면 친구가 아니다
# 좋은 친구 : 친구 중에서 이름의 길이가 같은 친구

cnt = 0 
for i in range(len(arr)-1):
    for j in range(i+1, min(len(arr),i+k+1)):
        if len(arr[i]) == len(arr[j]):
            cnt+=1
print(cnt)
728x90
반응형