package com.fishercoder.solutions;

import java.util.HashMap;
import java.util.Map;

public class _1010 {
    public static class Solution1 {
        /**
         * Credit: https://leetcode.com/problems/pairs-of-songs-with-total-durations-divisible-by-60/discuss/256726/Java-O(n)-code-w-comment-similar-to-Two-Sum
         * <p>
         * Think of Problem 1: Two Sum
         * Assume target is 60, each item in time % 60.
         * Then this problem becomes very similar to Problem 1.
         */
        public int numPairsDivisibleBy60(int[] time) {
            int result = 0;
            Map<Integer, Integer> map = new HashMap<>();
            for (int t : time) {
                int d = (60 - t % 60) % 60;
                if (map.containsKey(d)) {
                    result += map.get(d);
                }
                map.put(t % 60, map.getOrDefault(t % 60, 0) + 1);
            }
            return result;
        }
    }

    public static class Solution2 {
        /**
         * credit: https://leetcode.com/problems/pairs-of-songs-with-total-durations-divisible-by-60/solution/
         */
        public int numPairsDivisibleBy60(int[] time) {
            int[] remainders = new int[60];
            int ans = 0;
            for (int t : time) {
                if (t % 60 == 0) {
                    ans += remainders[0];
                } else {
                    ans += remainders[60 - t % 60];
                }
                remainders[t % 60]++;
            }
            return ans;
        }
    }
}