본문 바로가기
연습장

Find the odd int

by anothel 2021. 10. 19.

Given an array of integers, find the one that appears an odd number of times.

There will always be only one integer that appears an odd number of times.

 

Examples

[7] should return 7, because it occurs 1 time (which is odd).

[0] should return 0, because it occurs 1 time (which is odd).

[1,1,2] should return 2, because it occurs 1 time (which is odd).

[0,1,0,1,0] should return 0, because it occurs 3 times (which is odd).

[1,2,2,3,3,3,4,3,3,3,2,2,1] should return 4, because it appears 1 time (which is odd).

 

Solution

#include <vector>
#include <map>

int findOdd(const std::vector<int> &numbers) {
  std::map<int, bool> table;

  for (auto x : numbers) {
    table[x] = !table[x];
  }

  for (auto x : numbers) {
    if (table[x] == true) return x;
  }

  exit(1);
}

 

lucianmusat의 코드

#include <vector>

int findOdd(const std::vector<int>& numbers){
  for (auto elem: numbers){
    if (std::count(numbers.begin(), numbers.end(), elem) % 2 != 0) {
      return elem;
    }
  }
  return 0;
}

 

Unnamed의 코드

#include <functional>
#include <numeric>
#include <vector>

int findOdd(const std::vector<int>& numbers) {
  return std::accumulate(numbers.cbegin(), numbers.cend(), 0, std::bit_xor<>());
}

 

DJHenjin의 코드

#include <vector>

int findOdd(const std::vector<int>& numbers){
  int result = 0;
  for(auto& num : numbers){
    result = result ^ num;    
  }
  return result;
}

 

Unnamed의 코드

#include <functional>
#include <numeric>
#include <vector>

int findOdd(const std::vector<int>& numbers) {
  return std::reduce(numbers.cbegin(), numbers.cend(), 0, std::bit_xor<>());
}

 

후기

이 짧은 CodeKata에 정말 다양한 풀이법이 있다. STL은 그렇다 치고, XOR 비트 연산자 ^가 탐난다. 이런 걸 나는 ! 연산자로 바꿔가는 걸 했다니. 앞으로는 XOR를 사용하도록 해봐야겠다. 솔직히 좀 부럽기도 하다. 나는 모르는 걸 저 사람들은 어떻게 알고 저렇게 아름답게 풀어낼 수 있는 것일까.

 

(url: https://www.codewars.com/kata/54da5a58ea159efa38000836)

 

728x90

'연습장' 카테고리의 다른 글

Convert string to camel case  (0) 2021.10.19
Sum of Digits / Digital Root  (0) 2021.10.19
Split Strings  (0) 2021.10.19
Perimeter of squares in a rectangle  (0) 2021.10.19
곱셈 - 2588  (0) 2021.10.19