[백준] 3078번 좋은 친구 (C++)

2025. 9. 4. 16:56·Algorithm
728x90

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

 

 

이 문제는 좋은 친구가 되기 위해서 이름의 길이가 같아야 하고 등수의 차이가 K보다 작거나 같아야 하는데

이때 좋은 친구의 쌍의 개수를 구하는 문제이다.

 

처음엔 문제를 어떻게 접근해야할지 생각을 못했다 N의 크기가 30만 이기 때문에 길이가 같은 친구들끼리 묶은 후 모든 짝을 구해서

등수의 차이가 K이하인지 찾기에는 시간초과가 난다고 생각을 했다.

 

알고리즘 분류를 확인하니 큐, 슬라이딩 윈도우 구현방식을 확인하여 문제를 해결할 수 있었다.

 

 

문자열의 길이가 같은 친구들끼리 먼저 q에 넣는다 이때 현재 바라보는 문자가 큐에 가장 앞에 있는 인덱스의 차이가 K보다 작거나 같은 경우 이는 현재 i와 친구가 될 수 있는 쌍이기 때문에 계속해서 더해준다 하지만 K보다 큰 경우이는 같은 쌍이 될 수 없기에 K보다 작거나 같을때까지 앞에서 빼준다.

 

정답코드

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
#define endl "\n"
#define MAX 1e9

struct coordinate {
    int x;
    int y;
    int r;
};

int dx[] = {0 ,0, -1, 0, 1, 1, -1, -1, 1};
int dy[] = {0, -1, 0, 1, 0, -1, 1, -1, 1};
int N, K;
queue<int> q[21];
int arr[300001];

void solve() {
    ll cnt = 0;

    for(int i = 1;  i <= N; i++) {
        while(!q[arr[i]].empty() && i - q[arr[i]].front() > K) q[arr[i]].pop();
        cnt += q[arr[i]].size();
        q[arr[i]].push(i);
    }

    cout << cnt;
}

void input() {
    cin >> N >> K;

    for(int i = 1; i <= N; i++) {
        string s;
        cin >> s;
        arr[i] = s.length();
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    input();
    solve();
}

 

 

회고록

구현하는 방법이 생각이 안나서 굉장히 시간이 오래걸렸던 문제이다. 좋은 친구의 쌍을 구하기 위해서

큐를 사용하여 현재 바라보는 친구가 가장 높은 등수의 친구의 차이와 비교해서 쌍을 맺는것이 굉장히 

낯선 테크닉이였던 것 같다.

728x90
저작자표시 (새창열림)

'Algorithm' 카테고리의 다른 글

[백준] 19622번 회의실 배정 3 (C++)  (0) 2025.09.06
[백준] 1411번 비슷한 단어 (C++)  (0) 2025.09.05
[백준] 10653번 마라톤 2 (C++)  (0) 2025.09.03
[백준] 14888번 연산자 끼워넣기 (C++)  (0) 2025.09.02
[백준] 11502번 세 개의 소수 문제 (C++)  (0) 2025.09.01
'Algorithm' 카테고리의 다른 글
  • [백준] 19622번 회의실 배정 3 (C++)
  • [백준] 1411번 비슷한 단어 (C++)
  • [백준] 10653번 마라톤 2 (C++)
  • [백준] 14888번 연산자 끼워넣기 (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (284) N
      • Programming (51) N
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (7) N
        • Android (2)
        • CI,CD (1)
      • Algorithm (173)
        • Review (4)
      • Security (14)
        • WebHacking (3)
        • Websecurity (11)
      • OS (19)
        • Linux (12)
        • Mac os (2)
      • 머신러닝 (1)
      • CS(Computer Science) (12)
        • 컴퓨터 네트워크 (3)
        • 컴퓨터 구조 (1)
        • 인공지능 (8)
      • Docker (2) N
      • Dev Book Review (3)
        • Clean Code (1)
        • Effective Java (0)
        • Real MySQL (2)
      • SWM (1)
      • Review (6)
      • AWS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    BFS
    브루트포스
    백트래킹
    다익스트라
    트리
    Leviathan
    다이나믹 프로그래밍
    그래프 이론
    정렬
    DP
    구현
    linux
    Bandit
    에라토스테네스의 체
    백준
    c언어
    누적합
    우선순위큐
    wargame
    비트마스킹
    DFS
    투포인터
    코딩
    우선순위 큐
    WebSecurity
    그리디
    재귀
    깊이우선탐색
    시뮬레이션
    이분탐색
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 3078번 좋은 친구 (C++)
상단으로

티스토리툴바