개발관련
[codility] OddOccurrencesInArray
hjaelife
2023. 7. 27. 13:20
(문제) 홀수 개의 원소를 가지는 배열(Non-Array)에서 짝이 없는(non-paired) 원소 값을 반환하는 함수 작성
(my solution)
- 배열에서 짝이 있는 지 없는 지를 어떻게 판별할 건지?가 문제의 키 포인트였다.
- HashSet을 활용하여 Array를 모두 방문하고도 끝까지 남아있는 원소를 반환하는 방식으로 함수를 작성하였다.
- 따라서 시간복잡도는 최소, 최대, 평균 모두 O(N)이다. 무조건 배열의 원소 끝까지 방문해야 짝이 없는 원소 값을 찾을 수 있다.
- IntelliJ의 자동 완성 기능을 이용하여 개발하다보니 HashSet을 import할 때라던 지, 마지막 리턴문을 작성하기 어려웠다;
- 다른 문제풀이 방법으로는 1) 정렬 후 2) 짝이 없는 원소 값을 찾는 방법도 있다. 하지만 시간 복잡도가.. 퀵 정렬을 쓰더라도 1) O(NlogN) + 2) 최대 O(N) = O(N + NlogN)
package codility.tasks;
import java.util.HashSet;
public class OddOccurrencesInArray {
public static int solution(int[] A) {
HashSet<Integer> founded = new HashSet<>();
for (int i = 0; i < A.length; ++i) {
if (founded.contains(A[i])) {
founded.remove(A[i]);
} else {
founded.add(A[i]);
}
}
return (int) founded.toArray()[0];
}
}
(chatGPT) - 와.. 미친..
- XOR의 성질을 이용하여 짝이 있는 데이터는 상쇄시키고, 짝이 없는 나머지만 반환했다.
- 코드가 매우 심플하다. 시간복잡도는 O(N)
- unpaired를 0으로 초기화해야 하는 것에 유의해야 한다. (배열의 첫번째 원소 값을 변형 없이 그대로 유지하기 위해서)
class Solution {
public int solution(int[] A) {
int unpaired = 0;
for (int num : A) {
unpaired ^= num;
}
return unpaired;
}
}
*비트연산자 XOR (^)
두 비트가 같으면 0, 다르면 1을 반환한다.