알고리즘/고찰(?)

중복 된 숫자 개수 세기

jdaemanv2 2024. 8. 15. 11:42

[1. 개요]

어떤 배열에서 중복 된 숫자의 개수를 세야 할 때,

재귀로 구현했을 때 간과할 수 있는 오류(?) 등을 정리


[2. 재귀적인 방법]

fn _solve(input: &Vec<i32>, i: usize) -> i32 {
    if i >= input.len() {
        return 0;
    }

    let mut ret = 0;
    for j in i+1..input.len() {
        if input[i] == input[j] {
            ret += 1;
        }
    }
    return ret + _solve(&input, i+1);
}

 

아래는 위 rust 함수에 입력과 출력을 정리한 것이다.

입력 출력
[7, 7, 7] 3
[6, 5, 4] 0
[6, 2, 6]  1

 

[7, 7, 7] 과 [6, 5, 4] 는 예상한 결과가 발생한다.

그러나 [6, 2, 6] 은 2가 아니라 1이 출력 된다.

 

그 이유는 사실 위 함수는 같은 숫자의 개수를 반환하는 것이 아니라, 같은 숫자 쌍의 개수를 반환하기 때문이다.

 

즉, A=[7, 7, 7] 에서 {A0, A1}, {A0, A2} , {A1, A2} 이렇게 3 쌍이 있는 것이고,

함수의 목적이 다르다고 보면 되겠다.

 

for 문 중첩할 게 아니라면, 정렬해놓고 세는 편이 나아보인다.