자바 코딩테스트 강좌, 오일러 피 함수 구현하기

온라인 코딩테스트가 점점 더 많이 요구되는 현대 사회에서, 알고리즘 문제를 효과적으로 푸는 능력은 개발자에게 필수적인 훌륭한 스킬입니다. 오늘은 수학적 개념을 활용한 알고리즘 문제를 다루어 볼 것입니다. 이 강좌에서는 오일러 피 함수(Euler’s Totient Function)를 구현하고, 이를 자바 프로그래밍 언어로 해결하는 과정을 설명하겠습니다.

오일러 피 함수란?

오일러 피 함수는 주어진 양의 정수 n에 대해, 1부터 n까지의 정수 중에서 n과 서로소인 정수의 개수를 나타냅니다. 즉, n과 최대공약수가 1인 정수의 개수를 세는 함수입니다. 예를 들어:

  • φ(1) = 1 (1과 서로소인 수는 1 자신 뿐)
  • φ(2) = 1 (1, 2 중에서 2와 서로소인 수는 1)
  • φ(3) = 2 (1, 2, 3 중에서 3과 서로소인 수는 1과 2)
  • φ(4) = 2 (1, 2, 3, 4 중에서 4와 서로소인 수는 1과 3)

이 함수는 다양한 수 이론과 암호학 분야에서도 중요하게 사용됩니다. 이제 이 함수를 구현하는 문제를 풀어보겠습니다.

문제 설명

주어진 정수 n에 대해, 오일러 피 함수를 계산하는 함수를 구현하시오. 함수의 입력은 정수 n (1 ≤ n ≤ 10^6)이며, 출력은 φ(n)의 값입니다.

문제 해결 전략

오일러 피 함수를 구하는 방법에는 여러 가지가 있지만, 다음과 같은 알고리즘을 사용하여 효율적으로 구현할 수 있습니다:

  1. 소인수 분해: 먼저 n의 소인수를 구합니다. 소인수는 정수의 곱으로 표현할 수 있는 가장 작은 소수입니다.
  2. 오일러 피 함수 계산: π(n)의 성질을 이용하여 계산할 수 있습니다. 이는 다음과 같은 수식으로 표현할 수 있습니다:
φ(n) = n * (1 - 1/p1) * (1 - 1/p2) * ... * (1 - 1/pk)

위의 수식에서 p1, p2, ..., pkn의 소인수입니다. 이 수식을 통해 오일러 피 함수를 빠르게 계산할 수 있습니다.

자바 코드 구현

이제 자바 코드를 작성하여 오일러 피 함수를 구현해보겠습니다. 다음 코드 스니펫은 이 문제를 해결하는 방법을 보여줍니다:

public class EulerTotient {

    public static int eulerTotient(int n) {
        int result = n; // 결과를 n으로 초기화
        for (int p = 2; p * p <= n; p++) {
            // p가 n의 소인수인지 확인
            if (n % p == 0) {
                // 소인수인 경우 결과를 계산
                while (n % p == 0) {
                    n /= p;
                }
                result -= result / p; // 결과 업데이트
            }
        }
        // 마지막 소인수 처리
        if (n > 1) {
            result -= result / n;
        }
        return result;
    }

    public static void main(String[] args) {
        int n = 10; // 테스트할 입력
        System.out.println("φ(" + n + ") = " + eulerTotient(n)); // 결과 출력
    }
}

위 코드는 오일러 피 함수를 효율적으로 계산하기 위해 소인수 분해를 사용하여 연산을 수행하고 있습니다. 입력 값 n에 대해 π(n)이 계산되고, 결과가 출력됩니다.

코드 설명

1. 함수 정의

public static int eulerTotient(int n) 메서드는 입력된 정수 n의 오일러 피 함수를 계산하여 반환합니다. 최종 결과는 result라는 변수에 저장되며, 초기값으로 n을 설정합니다.

2. 소인수 체크

for 루프를 사용하여 p2부터 √n까지의 값을 가지며, pn의 소인수인지를 확인합니다. 소인수일 경우, n의 모든 p의 거듭제곱을 나누며 해당 소수에 대한 처리를 진행합니다.

3. 결과 계산

소인수 p를 찾으면 result를 업데이트하여 n과의 관계를 고려하여 최종적으로 φ(n) 값을 계산합니다. 마지막으로 n이 1보다 큰 경우 마지막 소인수 처리도 잊지 않아야 합니다.

4. 메인 메서드

main 메서드에서는 테스트할 n 값을 정의하고, 결과를 출력하도록 작성되어 있습니다.

결과 확인

위 코드를 실행하면, 입력값 10에 대한 오일러 피 함수의 값을 확인할 수 있습니다. 결과는 다음과 같습니다:

φ(10) = 4

10보다 작고 10과 서로소인 수는 1, 3, 7, 9로 총 4개입니다. 이를 통해 구현된 오일러 피 함수가 올바르게 작동하였음을 확인할 수 있습니다.

복습 및 마무리

이 강좌에서는 오일러 피 함수를 구현하고, 이를 통해 알고리즘 문제를 해결하는 과정을 살펴보았습니다. 오일러 피 함수는 수학적 사고를 바탕으로 한 알고리즘이며, 다양한 문제를 해결할 때 그 활용성이 크기 때문에 알아두면 좋습니다. 자바를 사용하여 구현한 이 코드는 특정 범위의 수에 대한 오일러 피 값을 효율적으로 계산할 수 있으며, 다양한 상황에서도 쉽게 적용할 수 있습니다.

앞으로도 알고리즘 문제를 지속적으로 다루며, 반복적으로 연습하는 것이 중요합니다. 이는 코딩테스트에서 성과를 내는데 큰 도움이 될 것입니다. 읽어주셔서 감사합니다!