leetcode - triples with bitwise AND equal to zero(java)

silver·2021년 7월 1일

level - hard

[문제 내용]
nums 배열에서 nums[i] & nums[j] & nums[k] == 0 인 i, j, k를 찾아 총 개수 반환

[example 1]

Input: nums = [2,1,3]
Output: 12
Explanation: We could choose the following i, j, k triples:
(i=0, j=0, k=1) : 2 & 2 & 1
(i=0, j=1, k=0) : 2 & 1 & 2
(i=0, j=1, k=1) : 2 & 1 & 1
(i=0, j=1, k=2) : 2 & 1 & 3
(i=0, j=2, k=1) : 2 & 3 & 1
(i=1, j=0, k=0) : 1 & 2 & 2
(i=1, j=0, k=1) : 1 & 2 & 1
(i=1, j=0, k=2) : 1 & 2 & 3
(i=1, j=1, k=0) : 1 & 1 & 2
(i=1, j=2, k=0) : 1 & 3 & 2
(i=2, j=0, k=1) : 3 & 2 & 1
(i=2, j=1, k=0) : 3 & 1 & 2

[해결 방법]
아직도 뇌가 조합알고리즘에 미쳐있어서 잠깐 좀 헤맸다..
간단한 해결방법으로는
i와 j를 먼저 모두 계산하여 그 결과값들의 count를 저장하고
나머지 k를 다시 그 저장한 계산한값과 연산하여 0이 되는 값을 찾아서
그 모든 count들을 다 더했다.

class Solution {
    public int countTriplets(int[] nums) {
        int n = nums.length;
        HashMap<Integer, Integer> nMap = new HashMap<>();
        for (int num : nums) {
            for (int i : nums) {
                int result = num & i;
                nMap.put(result, nMap.getOrDefault(result, 0) + 1);
            }
        }

        int result = 0;
        for(int num : nums) {
            for(int key : nMap.keySet()) {
                if((num & key) == 0) {
                    result += nMap.get(key);
                }
            }
        }

        return result;
    }
}

0개의 댓글