본문 바로가기
Leetcode

136. Single Number

by Doromi 2023. 10. 25.
728x90
반응형
주어진 정수 배열에서 한 번만 나타나는 유일한 숫자를 찾는 문제입니다. 이 문제는 비트 연산을 사용하여 풀 수 있는데, 아래는 문제의 자세한 설명입니다:

문제 설명:

정수 배열 nums가 주어집니다. 이 배열에는 오직 한 번만 나타나는 숫자가 하나만 있고, 나머지 숫자들은 모두 두 번씩 나타납니다. 오직 한 번만 나타나는 숫자를 찾아서 반환하세요.

예시:
Input: nums = [4,1,2,1,2]
Output: 4
위의 예시에서, 배열 nums에는 4가 하나만 나타나고, 나머지 숫자는 2번씩 나타나므로 4를 반환해야 합니다.

노트:

시간복잡도 O(n)과 추가 메모리 사용 없이 문제를 해결해야 합니다.
이 문제를 해결하는 한 가지 방법은 비트 연산을 사용하는 것입니다. 비트 연산을 사용하면 추가 메모리를 사용하지 않고도 문제를 효과적으로 해결할 수 있습니다. 주어진 배열을 모두 XOR 연산하면 유일한 숫자를 찾을 수 있습니다. XOR 연산은 다음과 같은 특징을 갖습니다:

어떤 숫자와 0을 XOR하면 그 숫자 자체가 반환됩니다: x ^ 0 = x
어떤 숫자와 그 자체를 XOR하면 0이 반환됩니다: x ^ x = 0
XOR 연산은 순서에 상관없이 합쳐질 수 있습니다: a ^ b ^ c = (a ^ b) ^ c
따라서, 주어진 배열을 모두 XOR 연산하면, 나타나는 숫자는 0과 XOR되어 없어지고, 유일한 숫자만 남게 됩니다. 이것이 문제를 해결하는 핵심 아이디어입니다.

 

   int singleNumber(vector<int>& nums) {
        int result = 0;
        for (int num : nums) {
            result ^= num;
        }
        return result;
    }

 

C# 코드:
 public int SingleNumber(int[] nums) {
        int ret=0;
        Array.Sort(nums);
        int init = 30001;
        bool isChecked = false;
        for(int i=0;i<nums.Length;i++){
            ret = nums[i];
            if(nums[i]!=init && isChecked==false){
                init = nums[i];
                isChecked = true;
            }
            else if(nums[i] != init && isChecked){
                ret = init;
                break;
            }
            else if(nums[i] == init && isChecked){
                isChecked = false;
            }
        }
        
    return ret;
    }

 

 이 코드는 배열 nums에서 단 한 번 나타나는 유일한 숫자를 찾는 방법으로 접근합니다.


ret 변수: 이 변수는 결과를 저장하는 데 사용됩니다. 초기값은 0으로 설정됩니다.

Array.Sort(nums): 배열 nums를 정렬합니다. 이것은 정렬된 배열을 사용하려는 의도로 보입니다.

init 변수: 이 변수는 현재까지 확인한 숫자를 저장하는 데 사용됩니다. 초기값은 30001로 설정됩니다.

isChecked 변수: 이 변수는 현재까지 확인한 숫자가 있는지 여부를 나타내는 플래그입니다. 초기값은 false로 설정됩니다.

반복문: for 루프를 사용하여 배열 nums를 순회합니다.

nums[i]!=init && isChecked==false: 현재 확인한 숫자가 이전까지 확인한 숫자와 다르고, 아직 확인한 숫자가 없는 경우(isChecked가 false), init 변수를 현재 숫자로 설정하고 isChecked를 true로 변경합니다.

nums[i] != init && isChecked: 현재 확인한 숫자가 이전까지 확인한 숫자와 다르고, 이미 확인한 숫자가 있는 경우, ret 변수에 init 값을 저장하고 반복문을 종료합니다.

nums[i] == init && isChecked: 현재 확인한 숫자가 이전까지 확인한 숫자와 같고, 이미 확인한 숫자가 있는 경우, isChecked를 false로 변경하여 다음 반복에서 새로운 숫자를 확인할 수 있도록 합니다.

반복문이 끝나면 ret에 유일한 숫자가 저장되어 반환됩니다.
728x90
반응형

'Leetcode' 카테고리의 다른 글

219. Contains Duplicate II  (0) 2023.10.28
268. Missing Number  (0) 2023.10.28
217. Contains Duplicate  (0) 2023.10.27
108. Convert Sorted Array to Binary Search Tree  (1) 2023.10.25
19. Remove Nth Node From End of List  (0) 2023.10.24