문제
- 문제 링크
- 정수 배열
nums
와 양수 k
가 주어진다. nums
에 있는 모든 수의 xor
결과가 k
와 같아지게 만들어야 한다. nums
에 있는 수에 대해서 몇 번이고 비트를 플립할 수 있을 때 k
와 같아지게 만드는 최소 플립 횟수를 구해야 한다.
- 제약 조건
- nums 배열 길이:
1 <= nums.length <= 10^5
- nums 값 범위:
0 <= nums[i] <= 10^6
- k 값 범위:
0 <= k <= 10^6
- 예시

풀이
풀기 전
- 처음엔
nums
에 있는 수를 이진수로 변환한 다음 한 자리씩 xor
하고 k
와 비교하려고 했다. 그런데 그럴 필요 없이, nums
에 있는 모든 수를 xor
한 다음 k
와 비교하면 되는 문제였다. 이진수로 변환할 필요도 없었다.
xor
은 값이 같으면 0을 반환하고 값이 다르면 1을 반환하는 게이트이다.
코드
class Solution {
public int minOperations(int[] nums, int k) {
int num = nums[0];
for (int i=1; i<nums.length; i++)
num ^= nums[i];
int ret = 0;
while (num > 0 || k > 0) {
if (num % 2 != k % 2)
ret++;
num /= 2;
k /= 2;
}
return ret;
}
}
푼 후
nums
에 있는 값들을 xor
연산하는 시간이 있으므로 시간 복잡도는 O(nums.length)
이다. 값이 다른지 비교하는 반복문도 있지만, 주어진 값의 최댓값이 10^6이므로 이진수로 변환해도 20자리밖에 안 된다.
- 상수 공간만 추가되므로
공간 복잡도는 O(1)
이다.