문제 개요
공백으로 구분된 숫자들이 담긴 문자열을 입력받아, 나머지 숫자들과 홀짝 성질이 다른 단 하나의 숫자를 찾아 반환하는 JavaScript 함수를 작성해야 합니다.
입력 문자열은 항상 다음 두 가지 경우 중 하나입니다.
- 모든 숫자가 홀수이고, 짝수가 딱 하나만 포함된 경우
- 모든 숫자가 짝수이고, 홀수가 딱 하나만 포함된 경우
함수는 이렇게 혼자만 성질이 다른 숫자를 찾아 반환하면 됩니다.
예제 코드
다음은 위 문제를 해결하는 JavaScript 코드입니다.
const str = '2 4 7 8 10';
const findDifferent = (str = '') => {
const odds = [];
const evens = [];
const arr = str
.split(' ')
.map(Number);
arr.forEach(num => {
if(num % 2 === 0){
evens.push(num);
}else{
odds.push(num);
};
});
return odds.length === 1 ? odds[0] : evens[0];
};
console.log(findDifferent(str));
실행 결과
코드를 실행하면 콘솔에 아래와 같은 결과가 출력됩니다.
7
코드 동작 원리
위 코드의 동작 과정을 단계별로 살펴보면 다음과 같습니다.
- 문자열 분리:
split(' ')을 사용해 문자열을 공백을 기준으로 잘라 배열로 만듭니다.'2 4 7 8 10'은['2', '4', '7', '8', '10']이 됩니다. - 숫자 변환:
map(Number)를 통해 각 문자열 요소를 숫자 타입으로 변환합니다. - 홀짝 분류:
forEach로 배열을 순회하면서num % 2 === 0조건으로 짝수는evens배열에, 그 외의 홀수는odds배열에 각각 저장합니다. - 결과 반환:
odds.length === 1이라면 홀수가 유일한 경우이므로odds[0]을, 그렇지 않다면 짝수가 유일한 경우이므로evens[0]을 삼항 연산자로 반환합니다.
예제 입력 '2 4 7 8 10'의 경우 짝수는 2, 4, 8, 10 네 개이고 홀수는 7 하나뿐이므로, 함수는 7을 정확히 반환합니다.
마무리
이 풀이법은 시간 복잡도 O(n)으로 문자열을 한 번만 순회하기 때문에 효율적이며, 로직이 단순하고 직관적이라 초보자도 쉽게 이해할 수 있습니다. 실무에서도 데이터 정제나 이상값(outlier) 탐색 같은 상황에 응용할 수 있는 유용한 패턴입니다.