PS
백준 3078. 좋은 친구
tose33
2023. 2. 11. 13:48
https://www.acmicpc.net/problem/3078
3078번: 좋은 친구
첫째 줄에 N과 K가 주어진다. (3 ≤ N ≤ 300,000, 1 ≤ K ≤ N) 다음 N개 줄에는 상근이네 반 학생의 이름이 성적순으로 주어진다. 이름은 알파벳 대문자로 이루어져 있고, 2글자 ~ 20글자이다.
www.acmicpc.net
우선 이름의 길이가 다르면 절대 좋은 친구가 될수 없으므로, 벡터에 이름의 길이별로 등수를 저장한다.
이 벡터의 최대길이는 30만이 될수 있을 것이므로 그냥 2중 for문으로는 tle다.
30만 크기의 배열 mark를 만들어, mark[등수] = 이름이 같은 길이의 학생중 몇번째인지를 저장한다.
예를들어 등수가 다음과 같다면
aaa 1등
bbb 4등
ccc 6등
mark 배열은 아래와 같이 만들어진다.
등수 | 몇 번째 |
1 | 1 |
2 | 1 |
3 | 1 |
4 | 2 |
5 | 2 |
6 | 3 |
K = 5 일때, aaa는 1등이고, 6등 까지는 aaa의 좋은 친구이다.
(mark[6] = 3) - (mark[1] = 1) = 2
따라서 aaa를 포함한 좋은친구 쌍은 2쌍이다.
큐로 푸는 방법.