반응형
개인적인 풀이일 뿐, 최적의 정답이 아님을 알려드립니다.
문제
https://www.acmicpc.net/problem/3078
난이도: 골드 3
사용언어: JAVA
풀이
문제를 해결하는 여러 방법이 있겠지만, 저는 큐를 이용하여 문제를 풀었습니다.
문제 해결 방법은 다음과 같습니다.
1. 한 명씩 입력을 받으며 큐에 삽입한다.
2. 등수의 차이가 K를 벗어나면 큐에서 삭제한다. (큐 내부에는 등수가 K 이내인 친구만 존재한다)
3. 입력을 받은 이름과 같은 길이의 이름이 큐에 몇 개가 남아있는지 체크하여 좋은 친구의 수를 구한다.
참고로 정답의 최댓값이 300000 * 299999 / 2로 Int형의 크기를 벗어나기 때문에 Long 타입으로 선언한 변수를 활용해야 합니다.
다음은 제가 작성한 코드입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
import java.util.*;
import java.io.*;
public class Main {
public static void main(String args[]) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
long cnt = 0;
Queue<String> q = new LinkedList<>();
long[] name_length = new long[21]; // K명 안에 이름 길이 별로 친구가 몇명이 있는지
for (int i = 0; i < N; i++) {
String now = br.readLine();
if (name_length[now.length()] > 0) {
cnt += name_length[now.length()]; // 이름 길이에 맞춰 좋은 친구의 수를 합산
}
q.add(now); // Queue에 넣고
name_length[now.length()]++; // 배열도 수정
if (q.size() > K) { // K등 이상이 차이가 나는 사람에 대해
name_length[q.poll().length()]--; // Queue에서 삭제 및 배열 수정
}
}
bw.write(String.valueOf(cnt));
bw.flush();
bw.close();
br.close();
}
}
|
cs |
반응형
'백준 온라인 저지 > Gold' 카테고리의 다른 글
[BOJ] 16437 - 양 구출 작전 (0) | 2022.07.30 |
---|---|
[BOJ] 5430 - AC (0) | 2022.02.09 |
[BOJ] 2116 - 주사위 쌓기 (0) | 2022.01.31 |
[BOJ] 10423 - 전기가 부족해 (2) | 2021.10.21 |
[BOJ] 20058 - 마법사 상어와 파이어스톰 (1) | 2021.10.06 |