알고리즘/고찰(?)
중복 된 숫자 개수 세기
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 문 중첩할 게 아니라면, 정렬해놓고 세는 편이 나아보인다.