본문 바로가기
Algorithm/💼Codility

[Lesson 2] OddOccurrencesInArray

by yewoneeee 2024. 7. 28.

문제


 

코드


fun solution(A: IntArray): Int {
    var unpaired = 0
    for(e in A) {
        unpaired = unpaired xor e
    }
    return unpaired
}

 

 

풀이


fun solution(A: IntArray): Int {
    val sortedA = A.sorted()
    // i , i + 1 확인 -> 같음 -> +2 해서 확인
    // i, i+1 다름 -> sortedA[i] 출력 후 break
    // i + 1 >= A.size 이면 [A.size-1] 출력
    var i = 0
    while(i < A.size-1) {
        if(sortedA[i] == sortedA[i+1]) i += 2
        else {
            return sortedA[i]
        }
    }
    return sortedA[A.size-1]
}


시간 복잡도가 O(n^2) 으로 탐색됐다고 뜬다

아마 sort 연산 때문인 것 같다

sort 없이 pair로 풀어봐야겠다 

 

fun solution(A: IntArray): Int {
    val list = mutableListOf<Int>()
    for (e in A) {
        if (list.contains(e)) list.remove(e)
        else list.add(e)
    }
    return list[0]
}

이렇게 작성했더니 점수가 더 떨어졌다..ㅋㅋ

 

fun solution(A: IntArray): Int {
    val set = A.toList().groupingBy{ it }.eachCount().filter{ it.value == 1 }.keys
    return set.first()
}

groupingBy와 eachCount(), filter를 활용해서 작성해봤다.

 

 

점수가 더 떨어졌다🥲

 

결국 혼자 해결하지 못하고 gpt에게 물어봤다.

비트연산으로 쉽게 해결할 수 있더라

각 숫자를 XOR 연산을 하면 짝이 맞는 숫자는 모두 0이 되고, 결국 홀수 번 나타나는 숫자만 남게 됩니다. 이는 O(n) 시간 복잡도로 문제를 해결할 수 있는 방법입니다.

 

이 말을 들으니까 같은 숫자를 xor하면 0이 된다는 것이 기억났다.

1011 XOR 1011 = 0000

XOR은 입력이 같으면 0, 다르면 1이기 때문이다.

 

시간 복잡도가 눈에 띄게 줄었다..

비트연산에 대해서도 더 공부해야겠다😥

 

'Algorithm > 💼Codility' 카테고리의 다른 글

[Lesson 2] CyclicRotation  (0) 2024.07.27
[Lesson 1] Binary Gap  (0) 2024.07.26

댓글