[알고리즘] 코테 유형 분석 27. 오일러 피 함수

최민길(Gale)·2023년 9월 14일
1

알고리즘

목록 보기
129/172

안녕하세요 오늘은 오일러 피 함수에 대해 포스팅해보겠습니다. 오일러 피 함수 P[N]이란 1부터 N까지 범위에서 N과 서로소인 자연수의 개수를 구하는 함수입니다. 오일러 피 함수는 에라토스테네스의 체에서 배수를 지우는 부분만 P[i] = P[i] - P[i]/K로 치환하는 방식으로 구현할 수 있습니다. 다음은 구현 방법입니다.

  1. 구하고자 하는 오일러 피의 범위만큼 배열 초기화
  2. 2부터 시작해 현재 배열의 값과 인덱스가 같으면(= 소수일 때) 현재 선택된 숫자(K)의 배수에 해당하는 수를 배열에 끝까지 탐색하여 P[i] = P[i] - P[i]/K 수행
  3. 배열의 끝까지 2번을 반복하여 오일러 피 함수 완성

백준 11689(GCD(n,k) = 1) 문제를 통해 오일러 피 함수를 구현해보겠습니다. 자연수 N이 주어졌을 때 n과 k의 최대공약수가 1을 만족하는 자연수 개수를 구하는 프로그램을 구현하는 문제입니다. 이 문제 자체가 오일러 피 함수의 정의이기 때문에 오일러 피 함수를 구현합니다. 입력 범위가 long이기 때문에 배열을 구현해서 에라토스테네스의 체를 사용하지 않고 구하고자 하는 결과값 P[N]을 N으로 초기화한 후 2부터 N의 제곱근까지 K의 숫자로 탐색하여 N과 k가 서로소가 아닐 경우 res = res - res/k로 처리하고 N과 k가 서로소가 될 때까지 나누어줍니다. N이 1보다 크다면 res = res - res/k 연산을 한번 더 수행한 후 결과를 출력합니다.

import java.util.*;
import java.io.*;

class Main{
    static long N;

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Long.parseLong(br.readLine());
        long res = N;
        for(long k=2;k<=Math.sqrt(N);k++){
            if(N%k == 0){
                res = res - res/k;
                while(N%k == 0) N /= k;
            }
        }

        if(N>1) res = res - res/N;
        System.out.println(res);
    }
}
profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글