package leetcode;

/**
 * https://leetcode.com/problems/number-of-equivalent-domino-pairs/
 */
public class Problem1128 {
    public int numEquivDominoPairs(int[][] dominoes) {
        int answer = 0;
        for (int i = 0; i < dominoes.length; i++) {
            for (int j = i + 1; j < dominoes.length; j++) {
                if ((dominoes[i][0] == dominoes[j][0] &&
                    dominoes[i][1] == dominoes[j][1]) ||
                    (dominoes[i][0] == dominoes[j][1] &&
                    dominoes[i][1] == dominoes[j][0])) {
                    answer++;
                }
            }
        }
        return answer;
    }

    public static void main(String[] args) {
        Problem1128 prob = new Problem1128();
        System.out.println(prob.numEquivDominoPairs(new int[][]{
            {1, 2}, {2, 1}, {3, 4}, {5, 6}
        })); // 1
        System.out.println(prob.numEquivDominoPairs(new int[][]{
            {1, 2}, {2, 1}, {1, 2}
        })); // 3
        System.out.println(prob.numEquivDominoPairs(new int[][]{
            {1, 2}, {2, 1}, {1, 2}, {1, 2}
        })); // 6
        System.out.println(prob.numEquivDominoPairs(new int[][]{
            {1, 2}, {2, 1}, {1, 2}, {1, 2}, {1, 2}
        })); // 10
        System.out.println(prob.numEquivDominoPairs(new int[][]{
            {1, 2}, {2, 1}, {1, 2}, {1, 2}, {1, 2}, {1, 2}
        })); // 15
    }
}

@@ -12,16 +12,119 @@
 tcode;%0A%0A
+import java.util.Arrays;%0Aimport java.util.Collection;%0Aimport java.util.HashMap;%0Aimport java.util.Map;%0A%0A
 /**%0A * h
@@ -309,56 +309,83 @@
     
-for (int i = 0; i %3C dominoes.length; i++) %7B%0A    
+Map%3CString, /*count*/ Integer%3E map = new HashMap%3C%3E();%0A        int max = 0;%0A
     
@@ -401,20 +401,16 @@
 int 
-j = i + 1; j
+i = 0; i
  %3C d
@@ -425,17 +425,17 @@
 length; 
-j
+i
 ++) %7B%0A  
@@ -448,16 +448,19 @@
     
-    if (
+Arrays.sort
 (dom
@@ -459,39 +459,76 @@
 sort(dominoes%5Bi%5D
-%5B0%5D == 
+);%0A            String key = Arrays.toString(
 dominoes%5Bj%5D%5B0%5D &
@@ -524,16 +524,12 @@
 oes%5B
-j%5D%5B0%5D &&
+i%5D);
 %0A   
@@ -541,214 +541,251 @@
     
-        dominoes%5Bi%5D%5B1%5D == dominoes%5Bj%5D%5B1%5D) %7C%7C%0A                    (dominoes%5Bi%5D%5B0%5D == dominoes%5Bj%5D%5B1%5D &&%0A                    dominoes%5Bi%5D%5B1%5D == dominoes%5Bj%5D%5B0%5D)) %7B%0A                    answer++;%0A                %7D
+if (!map.containsKey(key)) %7B%0A                map.put(key, 1);%0A                max = Math.max(max, 1);%0A            %7D else %7B%0A                int val = map.get(key) + 1;%0A                map.put(key, val);%0A                max = Math.max(max, val);
 %0A   
@@ -817,236 +817,146 @@
     
-return answer;
+// 2 -%3E  1
 %0A    
-%7D%0A%0A
     
-public static void main(String%5B%5D args) %7B%0A        Problem1128 prob = new Problem1128();%0A        System.out.println(prob.numEquivDominoPairs(new int%5B%5D%5B%5D%7B%0A            %7B1, 2%7D, %7B2, 1%7D, %7B3, 4%7D, %7B5, 6%7D
+// 3 -%3E  3 (+2)%0A        // 4 -%3E  6 (+3)%0A        // 5 -%3E 10 (+4)%0A        // 6 -%3E 15 (+5)%0A        // 7 -%3E 21 (+6)
 %0A       
  %7D))
@@ -951,26 +951,23 @@
 %0A       
- %7D));
  // 
-1
+...
 %0A       
@@ -971,225 +971,152 @@
     
-System.out.println(prob.numEquivDominoPairs(new int%5B%5D%5B%5D%7B%0A            %7B1, 2%7D, %7B2, 1%7D, %7B1, 2%7D%0A        %7D)); // 3%0A        System.out.println(prob.numEquivDominoPairs(new int%5B%5D%5B%5D%7B%0A            %7B1, 2%7D, %7B2, 1%7D, %7B1, 2%7D, %7B1, 2%7D
+int%5B%5D values = new int%5Bmax + 1%5D;%0A        values%5B2%5D = 1;%0A        for (int i = 3; i %3C= max; i++) %7B%0A            values%5Bi%5D += i - 1 + values%5Bi - 1%5D;
 %0A   
@@ -1125,16 +1125,8 @@
    %7D
-)); // 6
 %0A   
@@ -1134,277 +1134,158 @@
     
-System.out.println(prob.numEquivDominoPairs(new int%5B%5D%5B%5D%7B%0A            %7B1, 2%7D, %7B2, 1%7D, %7B1, 2%7D, %7B1, 2%7D, %7B1, 2%7D%0A        %7D)); // 10%0A        System.out.println(prob.numEquivDominoPairs(new int%5B%5D%5B%5D%7B%0A            %7B1, 2%7D, %7B2, 1%7D, %7B1, 2%7D, %7B1, 2%7D, %7B1, 2%7D, %7B1, 2%7D%0A        %7D)); // 15
+for (int count : map.values()) %7B%0A            if (count %3E= 2) %7B%0A                answer += values%5Bcount%5D;%0A            %7D%0A        %7D%0A        return answer;
 %0A   

Solve problem 1128