Algorithm πŸ§‘πŸ»‍πŸ’»/Leetcode

[Leetcode,c++] Single Number

dkswnkk 2021. 11. 19. 13:43

문제

 

Single Number - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

μ½”λ“œ

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        map<int,int>m;
        int ans;
        
        for(int i:nums) m[i]++;
        for(auto it = m.begin(); it!=m.end(); it++){
            if(it->second==1){
                ans=it->first;
                break;
            } 
        }
        return ans;
    }
};

 

풀이

λ‹¨μˆœνžˆ λ°°μ—΄μ—μ„œ μ€‘λ³΅λ˜μ§€ μ•Šμ€ 단 ν•˜λ‚˜μ˜ 수λ₯Ό μ°Ύμ•„μ„œ 좜λ ₯ν•˜λŠ” λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€. λ‚˜λ¦„ μœ„ ν’€μ΄μ²˜λŸΌ ν’€μ—ˆμ„ λ•Œ O(n)이기에 효율적인 μ½”λ“œλΌκ³  μƒκ°ν•˜κ³  μ œμΆœν–ˆμœΌλ‚˜, μ‹œκ°„μ΄ κ½€ κ±Έλ¦° 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έλ ‡κ²Œ λ‹€λ₯Έ μ‚¬λžŒμ˜ 풀이λ₯Ό 보닀가 μ•„λž˜μ™€ 같은 풀이λ₯Ό λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ans = 0;
        
        for(int i:nums) ans^=i;
        return ans;
    }
};

이전에 map을 μ‚¬μš©ν•˜μ—¬ ν’€μ—ˆλ˜ 풀이보닀 μ‹œκ°„μ΄ λ‘λ°°λ‚˜ 적게 κ±Έλ Έκ³ , λ©”λͺ¨λ¦¬λ„ 훨씬 덜 μž‘μ•„λ¨Ήμ€ 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

풀이λ₯Ό 보면 λ…Όλ¦¬μ—°μ‚°μžλ₯Ό μ΄μš©ν•΄μ„œ ν‘Ό 풀이인데 κ·Έ 방법이 μ‹ λ°•ν–ˆμŠ΅λ‹ˆλ‹€. XOR 연산인 ^ λΉ„νŠΈμ—°μ‚°μžλŠ” μ•„λž˜μ™€ 같은 μ§„λ¦¬ν‘œλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

INPUT OUTPUT
A B A XOR B
0 0 0
0 1 1
1 0 1
1 1 0

 

이 원리λ₯Ό μ΄μš©ν•΄μ„œ 배열에 값이 [4,1,2,1,2]κ°€ μžˆλ‹€κ³  μƒκ°ν•˜κ³  ans^=arr [i]; ꡬ문을 μˆ˜ν–‰ν•œλ‹€κ³  ν•΄λ΄…μ‹œλ‹€.

처음 ans = 4κ°€λ©λ‹ˆλ‹€.

κ·Έλ‹€μŒμ€ 0100^0001 = 0101 이 λ˜μ–΄ ans = 5이 되고,

λ‹€μŒ, 0101 ^ 0010 = 0111, ans=7,  

λ‹€μŒ, 0111 ^ 0001 = 0110, ans= 6,

λ‹€μŒ, 0110 ^0010 = 0100 , ans=4 κ°€ λ˜μ–΄ μ€‘λ³΅λ˜μ§€ μ•Šμ€ 4의 값을 λ½‘μ•„λ‚΄λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

κ²°κ΅­ λ˜‘κ°™μ€ 값에 λŒ€ν•΄ ^ 연산을 두 번 μˆ˜ν–‰ν•˜κ²Œ 되면, μ›λž˜μ˜ κ°’μœΌλ‘œ λŒμ•„μ˜€λŠ” 원리λ₯Ό μ΄μš©ν•œ κ²ƒμž…λ‹ˆλ‹€.