파이썬 코딩테스트 강좌, 제곱이 아닌 수 찾기

안녕하세요, 여러분! 이번 블로그 포스트에서는 제곱이 아닌 수 찾기라는 알고리즘 문제를 풀어보도록 하겠습니다. 이 문제는 코딩 테스트에서 자주 출제되는 유형의 문제 중 하나로, 수학적 사고와 프로그래밍 능력을 동시에 요구합니다. 본 글에서는 문제 설명, 풀이 아이디어, 실제 코드, 그리고 시간 복잡도 분석까지 모든 과정을 자세히 설명하겠습니다.

문제 설명

주어진 자연수 N이 있을 때, 1부터 N까지의 자연수 중 제곱수가 아닌 수의 개수를 구하는 함수를 작성하세요. 제곱수란, 어떤 자연수 x가 있을 때 x * x = y 형태로 표현될 수 있는 수를 의미합니다. 예를 들어, 1(1 * 1), 4(2 * 2), 9(3 * 3), 16(4 * 4) 등이 제곱수입니다.

입력

  • 자연수 N (1 ≤ N ≤ 106)

출력

  • 제곱수가 아닌 수의 개수를 출력합니다.

예제

입력

N = 10

출력

7

설명: 1부터 10까지의 자연수는 1, 2, 3, 4, 5, 6, 7, 8, 9, 10입니다. 이 중 1, 4, 9가 제곱수이므로 10 – 3 = 7개의 수가 제곱수가 아닙니다.

풀이 아이디어

이 문제를 해결하기 위해서는 다음과 같은 단계를 따라야 합니다:

  1. 1부터 N까지의 각 자연수 중 제곱수인지 확인합니다.
  2. 제곱수의 개수를 세고, 이를 N에서 빼면 제곱수가 아닌 수의 개수를 구할 수 있습니다.

제곱수를 찾는 방법으로는, 1부터 √N까지의 정수를 제곱하여 1부터 N까지의 제곱수를 미리 구해놓은 뒤, 제곱수의 개수를 센 후 이를 N에서 빼는 방법을 사용할 수 있습니다. 이를 통해 우리는 O(√N) 시간 복잡도로 문제를 해결할 수 있습니다.

구현

이제 문제를 해결하는 코드를 파이썬으로 작성해보겠습니다. 아래는 제곱수가 아닌 수의 개수를 세는 함수입니다:


import math

def count_non_squares(N):
    if N < 1:
        return 0
    
    # 제곱수의 개수 계산
    square_count = int(math.sqrt(N))
    
    # 제곱수가 아닌 수의 개수
    return N - square_count

코드 설명

  • 우선, math.sqrt(N)를 사용해 N의 제곱근을 구합니다. 이는 N 이하의 자연수 중 제곱수가 몇 개인지 알기 위한 기초 정보를 제공합니다.
  • 그 다음, int()를 사용하여 제곱근을 정수형으로 변환해 제곱수의 개수를 나타냅니다.
  • 마지막으로, N에서 제곱수의 개수를 빼서 제곱수가 아닌 수의 개수를 출력합니다.

시간 복잡도 분석

본 문제의 시간 복잡도는 O(1)입니다. 입력 N이 클 경우에도 제곱근을 계산하는 것은 빠르게 해결할 수 있습니다. 따라서 이 알고리즘은 매우 효율적입니다.

결론

이번 포스트에서는 제곱이 아닌 수를 찾는 문제를 다루어 보았습니다. 이 문제는 단순한 수학적 사고를 필요로 하며, 문제 해결을 위한 효율적인 알고리즘 코딩 능력을 배양하는 데에 도움을 줄 수 있습니다. 코딩 테스트에서 자주 접하는 유형의 문제이니 잘 연습해 두시길 바랍니다!

다음 강좌에서는 더욱 흥미로운 문제를 다루도록 하겠습니다. 감사합니다!