백준(G4) 3078번: 좋은 친구(파이썬, Python3)

2023. 1. 14. 15:00·Python/백준 문제풀이
반응형

전형적인 큐 문제다. 슬라이딩 윈도우 방법으로 풀 수도 있지만 deque를 블로그에서 설명한 적이 있어서 큐로 설명하겠다!

https://solution-is-here.tistory.com/117

 

백준(G5) 5430번: AC (파이썬, Python3) 및 deque 설명

https://www.acmicpc.net/problem/5430 5430번: AC 각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다. www.acmicpc.net 파

solution-is-here.tistory.com

deque를 잘 모르시는 분이 계시면 위 글을 보고 오셔야 합니다!

deque를 안다고 가정하고 문제를 설명하겠습니다.

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

 

3078번: 좋은 친구

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

www.acmicpc.net

문제가 상당히 길다.. 국어 비문학 지문 푸는 기분이 들었다.

문제를 간단히 요약하자면 첫줄에 상근이네 반 학생 수와 친구가 될 수 있는 성적 차가 주어진다.

친한 친구는 주어진 성적 차보다 차이가 많이 나면 안 되며 이름의 길이가 같아야 한다.

위 예시로 설명을 하자면 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)
 
Colored by Color Scripter
cs
반응형
'Python/백준 문제풀이' 카테고리의 다른 글
  • 백준(G5) 9251번: LCS(파이썬,Python3)
  • 백준(G3) 2252번: 줄 세우기 (파이썬, Python3) + 위상정렬
  • 백준(G3) 2812번: 크게 만들기(파이썬, Python3)
  • 백준(G4) 1744번: 수 묶기 (파이썬,Python3)
코딩하는_대학생
코딩하는_대학생
Java Developer, Open Source Enthusiast, Proud Son
  • 코딩하는_대학생
    코딩하는 대학생에서 개발자까지
    코딩하는_대학생
  • 전체
    오늘
    어제
    • 분류 전체보기 (218)
      • 코딩하는 대학생의 책 추천 (8)
        • 클린코드 (5)
        • 헤드퍼스트 디자인패턴 (3)
      • Backend (8)
        • Spring (14)
        • AWS (3)
        • 회고 (4)
        • Redis (5)
        • 다양한 시각에서 바라본 백엔드 (3)
      • Python (35)
        • 개념 및 정리 (15)
        • 백준 문제풀이 (20)
      • JAVA (17)
        • 개념 및 정리 (14)
        • 백준 문제풀이 (2)
      • 왜? (7)
      • C언어 (42)
        • 개념 및 정리 (9)
        • 백준 문제풀이 (32)
      • 개인 공부 (27)
        • 대학 수학 (5)
        • 대학 영어 (10)
        • 시계열데이터 처리 및 분석 (5)
        • 컴퓨터 네트워크 (6)
        • 운영체제 (1)
      • 솔직 리뷰 (23)
        • 꿀팁 (6)
        • IT기기 (1)
        • 국내 여행 (7)
        • 맛집 (2)
        • 알바 리뷰 (2)
      • 대외활동 (17)
        • 체리피우미 3기 (4)
        • 꿀잠이들 6기 (13)
      • 음식 평가 (1)
      • 일상 & 근황 (2)
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코딩하는_대학생
백준(G4) 3078번: 좋은 친구(파이썬, Python3)
상단으로

티스토리툴바