※. a ~ k (0 ~ 15) 의 배열을 만든다.(배열을 두 개 만들어도 되고 이중배열로 만들어도 됨)
※. 문자를 하나 받을 때 마다 해당 문자의 아스키 코드 - 'a'의 아스키 코드를 증가시켜준다
(첫번째 글자의 배열 증가, 두번째 글자의 배열 증가를 같이 해줘야함)
※. 같은 문자가 있었다면 같은 문자가 나온 횟수(sub) 를 저장해준다.
※. 받은 문자의 (첫번째 글자가 나온 횟수 - sub) + (두번째 글자가 나온 횟수 - sub)를 해준다.
※. 정수 타입에 주의한다. long (N이 10만 -> aa가 5만 ab가 5만이라면 25억으로 int를 초과)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
public class Main {
public static void main(String arg[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
while(T --> 0) {
int N = Integer.parseInt(br.readLine());
HashMap<String, Integer> hashmap = new HashMap<>();
long result = 0;
int[][] letter = new int[16][2]; // 0 front 1 behind
for(int i = 0; i < N; i++) {
String str = br.readLine();
int front = str.charAt(0) - 'a';
int behind = str.charAt(1) - 'a';
int sub = 0;
if(hashmap.containsKey(str)) {
int temp = hashmap.get(str);
sub = temp;
hashmap.put(str, temp+1);
}
else {
hashmap.put(str, 1);
}
result += letter[front][0] - sub;
result += letter[behind][1] - sub;
letter[front][0]++;
letter[behind][1]++;
}
sb.append(result).append('\n');
}
System.out.println(sb);
}
}
'코드포스' 카테고리의 다른 글
[Codeforces Round #806 (Div. 4)] E. Mirror Grid (0) | 2022.07.20 |
---|---|
[Codeforces Round #784 (Div. 4)] H. Maximal AND (0) | 2022.07.07 |
[Codeforces Round #790 (Div. 4)] E. Eating Queries (0) | 2022.05.18 |
[Codeforces Round #786 (Div. 3)] C. Infinite Replacement (0) | 2022.05.04 |
[Codeforces Round #784 (Div. 4)] D. Colorful Stamp (0) | 2022.04.22 |