There is an array with some numbers. All numbers are equal except for one. Try to find it!
The tests contain some very huge arrays, so think about performance.
🚩 문제해석
아주 단순하다. 배열 중에서 값이 다른 요소가 하나 있는데 그것을 찾아라! 라는 것이다. 아주 큰 배열이 들어올 때의 성능(효율성)에 대해서도 생각하라고 한다.
function findUniq(arr) {
let findNumber;
arr.forEach(function(ele){
if(arr.indexOf(ele) === arr.lastIndexOf(ele)){
findNumber = ele;
return
}
});
return findNumber;
}
'배열의 모든 요소를 다 순회해서 비교하는 방법 밖에 없나' 라는 생각을 극복하기 위해서 여러가지 메소드나 방법들에 대해서 생각해봤는데, 역시 비교 할 수 밖에 없었다. 그래서 위의 코드처럼 indexOf()와 lastIndexOf()를 사용하여서 문제를 풀이하였다. 우선은 사이트에서 주어지는 모든 테스트 샘플은 통과하였다. 하지만, 위 코드는 사실 성능면, 속도면에서 그렇게 좋다고 생각하진 않는다. indexOf()와 lastIndexOf()가 모두 실행할 때마다 배열을 1번씩 다 확인한다. 그것도 forEach()안에서 그런 메소드가 실행되기 때문에 O(n^2)라고 볼 수 있다. 코드가 마음에 들지는 않지만 결과는 통과이기 때문에 우선 넘어간 후 다른 좋은 풀이들에 대해서 살펴보았다. 그리고 Array 메소드들의 기저에서 돌아가는 원리, 개념들에 대해서 찾아보고 분석하는 것도 좋은 테마거리라고 생각한다. 그 부분에 있어서도 찾아서 정리해봐야겠다.
function findUniq(arr) {
arr.sort((a,b)=>a-b);
return arr[0]==arr[1]?arr.pop():arr[0]
}
깜박 잊고 있었다. 정렬에 대해서...뭔가 빨리 검색하고 빨리 찾기 위해서 정렬을 하면 좀 더 쉽고 빠르게 할 수 있다는 것을. 물론 어떻게 정렬하는가에서도 소모값이 들어가기 때문에 그 부분에 있어서도 생각해야할 문제일 수 있다. 하지만 여기서는 정렬을 하여 해결을 하면 좀 더 빠르게 해결 할 수 있다. 그와 더불어 이 부분
return arr[0]==arr[1]?arr.pop():arr[0]
에 대한 아이디어는 굉장히 센스 있는 코드인 것 같다. 이런 부분을 보면 살며시 미소가 지어진다. 내가 한 것도 아닌데 뭔가 재미있고 깨달음의 미소인 건지 아니면 좋은걸 하나 배워서 즐거워하는 미소인 것인지...
남의 코드를 보는 재미가 솔솔하다. 그리고 codewars는 외국사이트라서 그런지 코드들이 뭔가 정형화 되어 있지 않고 자기만의 스타일로 풀어낸 부분들이 많다. 굉장히 쉬운 문제들일지라도 그 안의 코드를 이해하고 더 나아가 왜 코드를 이렇게 만들었는지에 대해서도 생각하다보면 코드를 바라보는 안목이 한층 더 올라갈 것이라고 생각한다.
🚀 문제를 풀어나갈 때 생각의 흐름을 정리합니다. 또한 새로운 풀이에 대한 코드를 분석하고 모르는 부분에 대해서 정리합니다. 생각이 다른 부분에 대한 피드백은 언제나 환영합니다. 틀린 내용에 대한 피드백 또한 항상 감사합니다.