전형적인 큐 문제다. 슬라이딩 윈도우 방법으로 풀 수도 있지만 deque를 블로그에서 설명한 적이 있어서 큐로 설명하겠다!
https://solution-is-here.tistory.com/117
deque를 잘 모르시는 분이 계시면 위 글을 보고 오셔야 합니다!
deque를 안다고 가정하고 문제를 설명하겠습니다.
https://www.acmicpc.net/problem/3078
문제가 상당히 길다.. 국어 비문학 지문 푸는 기분이 들었다.
문제를 간단히 요약하자면 첫줄에 상근이네 반 학생 수와 친구가 될 수 있는 성적 차가 주어진다.
친한 친구는 주어진 성적 차보다 차이가 많이 나면 안 되며 이름의 길이가 같아야 한다.
위 예시로 설명을 하자면 CYNTHIA와 LLOYD는 친한 친구가 될 수 없다. 그들은 이름의 길이가 다르기 때문이다.
LLOYD와 KEVIN은 친한친구가 될 수 있다. 이름의 길이가 같으며, 성적 차가 3보다 작거나 같기 때문이다.
예시로 볼수 있듯이 이 문제는 이름의 길이와 성적차가 매우 중요한 문제다.
코드와 함께 설명하겠다.
1
2
3
4
5
|
friends, gap = map(int,input().split())
friends_length = []
freineds_list = deque([])
alpha = [0] * 21
result = 0
|
cs |
map함수를 이용해서 친구의 수와 성적차를 받았다.
친구들의 이름 길이를 저장할 리스트의 이름을 friends_length로 지었다.
friends_list는 deque를 이용해서 제거하고 추가하기 때문에 deque함수를 이용해 리스트를 만들었다.
alpha는 이름의 길이의 합을 구하기 위해 만든 배열이다. result는 정답값을 저장하기 위해 만든 변수다.
1
2
|
for _ in range(friends):
friends_length.append(len(input().strip()))
|
cs |
그 후, 앞에서 받은 친구수 만큼 반복하는 for 반복문을 이용해서 friends_length리스트에 친구들의 이름 길이를 넣었다.
이때 혹시 모르니 빈칸 제거 함수 strip()을 사용하시는 걸 권장합니다.
1
2
3
4
5
6
7
|
for i in friends_length:
alpha[i] += 1
freineds_list.append(i)
if len(freineds_list) > gap + 1:
pop_friend = freineds_list.popleft()
alpha[pop_friend] -= 1
result += (alpha[i] -1)
|
cs |
친구들의 이름 수를 저장한 리스트에서 for 반복문을 이용해 값을 하나씩 꺼냈다.
alpha[이름길이] += 1을 해준다. 그리고 friends_list에 이름 길이를 넣어줬다.
그 후, if 조건문을 이용해서 만약 성적 차에서 1 더한 값보다 friends_list의 길이가 더 크다면 deque의 popleft 함수를 이용해서 가장 앞에 있는 값(맨 처음 넣은 값)을 제거한 뒤, alpha에서 제거한 값의 길이 배열값을 1 줄여줍니다.
*자기 자신과 다른 값을 비교하기 때문에 리스트의 길이가 성적차+1보다 작거나 같아야 합니다.
조건문을 실행한 뒤, 결과값에 (alpha[이름길이] -1)을 해준다.
*-1을 하는 이유: for 반복문 바로 밑줄에서 +1을 해줬기 때문에 -1을 해준다.
정답 코드:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import sys
from collections import deque
input = sys.stdin.readline
friends, gap = map(int,input().split())
friends_length = []
freineds_list = deque([])
alpha = [0] * 21
result = 0
for _ in range(friends):
friends_length.append(len(input().strip()))
for i in friends_length:
alpha[i] += 1
freineds_list.append(i)
if len(freineds_list) > gap + 1:
pop_friend = freineds_list.popleft()
alpha[pop_friend] -= 1
result += (alpha[i] -1)
print(result)
|
cs |