[LeetCode] 136. Single Number
LeetCode - 136. Single Number 알고리즘 문제 풀이
분류
문제 링크 : https://leetcode.com/problems/single-number/
풀이
비어 있지 않은 정수 벡터가 주어지고, 배열의 원소는 단 하나를 제외하고 두 번씩 나타난다.
이때 하나만 나타나는 원소의 값을 반환한다.
해시를 사용하여 접근하기
이 문제를 해결하기 위해 해시 자료구조를 사용하는 것을 생각해볼 수 있다.
벡터의 원소를 key로 하여 해당 key가 몇 번 등장했는지 빈도 수를 증가시킨다.
하나의 원소를 제외한 모든 원소는 두 번씩 나타나므로 빈도수가 2가 되면 제거한다.
이것을 반복했을 때 가장 마지막에 남아있는 원소가 한 번만 등장한 원소가 된다.
class Solution {
public:
int singleNumber(vector<int>& nums) {
unordered_map<int, int> um;
for (int k : nums) {
++um[k];
if (um[k] == 2) { // check 2
um.erase(k);
}
}
return um.begin()->first;
}
};
비트 연산을 통해 접근하기
모든 원소가 두 번씩 등장한다는 조건에 의해 XOR 연산을 생각할 수 있다.
XOR 연산의 특징은 다음과 같다.
- 0으로 초기화 되어있는 임의의 변수 ret 에 어떤 값 k를 두 번 XOR 연산하면 ret 의 결과는 항상 0이다.
- 0으로 초기화 되어있는 임의의 변수 ret 에 어떤 값 k를 한 번 XOR 연산하면 ret 의 결과는 항상 k이다.
ret = 0;
ret ^= k;
// ret is alwyas k.
ret ^= k;
// ret is always 0 (zero).
따라서 이 문제는 문제 조건(단 하나의 숫자를 제외한 모든 수는 두 번 등장한다)에 의해 XOR연산을 활용하여 풀 수 있다. (소스 코드는 아래에)
소스 코드
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ret = 0;
for (int k : nums) {
ret ^= k;
}
return ret;
}
};