자바스크립트 코딩테스트 강좌, 제곱이 아닌 수 찾기

안녕하세요, 여러분! 오늘은 자바스크립트를 이용한 코딩테스트 문제 중 하나인 “제곱이 아닌 수 찾기” 문제를 함께 풀어보도록 하겠습니다. 이 문제는 개발자 면접에서 자주 등장하는 문제 중 하나로, 기본적인 알고리즘 사고와 자바스크립트의 기본 문법에 대한 이해를 필요로 합니다.

문제 설명

주어진 수의 배열에서 제곱수들이 아닌 수들만 필터링하여 반환하는 함수를 작성하세요.

제곱수란 어떤 정수 n에 대해 n*n과 같은 형태로 나타낼 수 있는 수를 의미합니다. 예를 들어, 1, 4, 9, 16, 25는 각각 1의 제곱, 2의 제곱, 3의 제곱, 4의 제곱, 5의 제곱입니다.

입력 및 출력

  • 입력: 정수로 이루어진 배열 (예: [1, 2, 3, 4, 5, 6])
  • 출력: 제곱수가 아닌 수로 구성된 배열 (예: [2, 3, 5, 6])

예제

입력: [1, 2, 3, 4, 5, 6]
출력: [2, 3, 5, 6]
입력: [9, 10, 11, 12, 13, 14]
출력: [10, 11, 12, 13, 14]

문제 풀이 과정

1단계: 문제 이해하기

먼저 문제를 이해하기 위해 요구 사항을 정리해보겠습니다. 우리는 정수 배열을 받고, 이 배열에서 제곱수를 제외한 나머지 수들을 찾아야 합니다. 제곱수를 판단하기 위해서는 각 수의 제곱근을 계산하여 정수인지 여부를 파악할 수 있습니다.

2단계: 예제 분석하기

주어진 예제를 통해 어떤 수가 제곱수인지 확인해보겠습니다. 예를 들어 배열 [1, 2, 3, 4, 5, 6]에서 제곱수는 14입니다. 나머지 수들 2, 3, 5, 6는 제곱수가 아니므로 결과 배열에는 포함되어야 합니다.

3단계: 해결 방법 생각하기

문제를 해결하기 위해 다음과 같은 방법을 사용할 수 있습니다:

  1. 각 수를 순회하면서 제곱수인지 확인합니다.
  2. 정수 n에 대해 n*n과 같은 수가 존재하면 해당 수는 제곱수입니다.
  3. 제곱수가 아닌 수들을 새로운 배열에 추가합니다.
  4. 최종적으로 새로운 배열을 반환합니다.

4단계: 코드 구현하기

위에서 논의한 방법을 바탕으로 자바스크립트 코드를 작성해보겠습니다.

function isPerfectSquare(num) {
    const sqrt = Math.sqrt(num);
    return sqrt === Math.floor(sqrt);
}

function findNonPerfectSquares(arr) {
    return arr.filter(num => !isPerfectSquare(num));
}

// 예제 테스트
console.log(findNonPerfectSquares([1, 2, 3, 4, 5, 6])); // [2, 3, 5, 6]
console.log(findNonPerfectSquares([9, 10, 11, 12, 13, 14])); // [10, 11, 12, 13, 14]

5단계: 코드 설명하기

위 코드에서는 두 개의 함수를 정의했습니다:

  • isPerfectSquare(num): 주어진 수가 제곱수인지 확인하는 함수입니다. 제곱근을 구하고, 소수점 이하를 버려 원래 수와 같은지를 비교합니다.
  • findNonPerfectSquares(arr): 주어진 배열에서 제곱수가 아닌 수들만 필터링하여 새로운 배열로 반환하는 함수입니다. Array.filter() 메서드를 이용하여 제곱수가 아닌 수를 찾아냅니다.

6단계: 성능 고려하기

이 코드의 시간 복잡도는 O(n)입니다. 배열의 각 원소를 한 번씩 확인하기 때문에, 최악의 경우 배열의 길이에 비례하여 성능이 소모됩니다. 이 알고리즘은 충분히 효율적이며, 실제 문제에서도 좋은 성능을 발휘할 수 있습니다.

7단계: 다양한 테스트 케이스 다루기

마지막으로, 이 문제를 해결하기 위해 추가적인 테스트 케이스를 활용해보겠습니다:

  • 에지 케이스: 빈 배열 []는 어떠한 출력이 나와야 할까요? – 빈 배열 []를 반환해야 합니다.
  • 음수 포함: [-1, -4, 3, 8]의 경우 제곱수가 아닌 수는 -1, 3, 8입니다.
  • 변화하는 배열: [0, 1, 2, 3, 16, 25]의 경우 제곱수가 아닌 수는 [2, 3]입니다.

결론

오늘은 “제곱이 아닌 수 찾기”라는 문제를 해결해보았습니다. 이 문제를 통해서 기본적인 배열 처리와 수학적 개념인 제곱수에 대해 이해할 수 있었습니다. 자바스크립트의 기본 문법과 배열 메서드를 활용하여 문제를 해결하는 방법을 배웠습니다.

코딩테스트 준비를 하면서 다양한 유형의 문제를 풀어보는 것이 중요합니다. 여러 문제를 풀어보며 알고리즘의 기본 개념을 확립하고, 문제 해결 능력을 키우시길 바랍니다. 다음 강의에서는 더욱 흥미로운 문제를 다루도록 하겠습니다!

감사합니다!