최근 이래저래 일이 많아서 오랜만에 알고리즘을 풀었다..
꾸준히 풀어야하는데ㅠ_ㅠ
그리고 원래는 java로 ps 푸는데 요즘은 swift와 병행할까 생각중이다.
처음에는 Queue에 다 때려박고 순회 돌면서 계산하도록 풀었다.
근데 당연히 시간초괔ㅋㅋㅋ(범위 좀 미리 보는 습관을 들이자...)
내가 solve한 방법은 다음과 같다.
import java.io.*;
import java.util.*;
public class BOJ3078 {
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 k = Integer.parseInt(st.nextToken());
int n = Integer.parseInt(st.nextToken());
int[] lengthArr = new int[k];
Queue<Integer> lengthQ = new LinkedList<>();
HashMap<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < k; i++) {
lengthArr[i] = br.readLine().length();
if (i == 0) {
continue;
}
if(i <= n) {
if(map.containsKey(lengthArr[i])) {
map.put(lengthArr[i], map.get(lengthArr[i]) + 1);
}
else {
map.put(lengthArr[i], 1);
}
continue;
}
lengthQ.offer(lengthArr[i]);
}
long answer = 0;
for(int index = 0; index < k; index++) {
if(index == 0) {
if(map.containsKey(lengthArr[index])) {
answer += map.get(lengthArr[index]);
}
continue;
}
if(map.containsKey(lengthArr[index])) {
if(map.get(lengthArr[index]) == 1) {
map.remove(lengthArr[index]);
}
else {
map.put(lengthArr[index], map.get(lengthArr[index]) - 1);
}
}
if(!lengthQ.isEmpty()) {
int next = lengthQ.poll();
if(map.containsKey(next)) {
map.put(next, map.get(next) + 1);
}
else {
map.put(next, 1);
}
}
if(map.containsKey(lengthArr[index])) {
answer += map.get(lengthArr[index]);
}
}
bw.write(answer + "");
bw.flush();
bw.close();
}
}