스위프트(Swift) 코딩테스트 준비를 위한 강좌로, 우리는 오일러 피 함수를 다룰 것입니다. 오일러 피 함수는 정수의 고유한 성질을 이해하는 데 매우 중요한 개념으로, 수론 및 알고리즘 문제에서 자주 등장합니다.
오일러 피 함수란?
오일러 피 함수 φ(n)은 n 이하의 정수 중에서 n과 서로소인 정수의 개수를 나타냅니다. 서로소란 두 정수가 1을 제외하고는 공약수가 없는 경우를 의미합니다. 예를 들어, φ(1) = 1, φ(2) = 1, φ(3) = 2 (1과 2가 서로소)입니다. 오일러 피 함수는 특히 암호학과 수론의 여러 문제에서 중요한 역할을 합니다.
문제 설명
주어진 자연수 N에 대해, 1부터 N까지의 모든 정수 중 n과 서로소인 정수의 개수를 구하는 프로그램을 작성하세요.
입력 형식
- 첫 번째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 주어집니다.
출력 형식
- 단일 정수 φ(N)를 한 줄에 출력합니다.
예제 입력 및 출력
입력:
10
출력:
4
위 예제에서 φ(10)는 4입니다. 이는 1, 3, 7, 9가 10과 서로소이기 때문입니다.
문제 해결 접근법
오일러 피 함수를 계산하기 위해서는 다음 단계로 접근할 수 있습니다:
- 소수의 개념을 이해하고, n의 모든 소수 약수를 찾아야 합니다.
- n이 소수인 경우, φ(n) = n – 1임을 이용합니다.
-
n을 소수의 곱으로 분해하여 φ(n)을 유도하는 공식을 사용합니다:
φ(n) = n * (1 - 1/p1) * (1 - 1/p2) * ... * (1 - 1/pk)
여기서 p1, p2, …, pk는 n의 모든 소수 약수입니다.
스위프트 코드 구현
이제 위의 접근법을 바탕으로 스위프트로 오일러 피 함수를 구현하겠습니다.
import Foundation
func eulerTotientFunction(_ n: Int) -> Int {
var result = n
var number = n
var p = 2
while p * p <= number {
// p가 number의 약수인지 확인
if number % p == 0 {
// p의 약수를 제거
while number % p == 0 {
number /= p
}
// 오일러 피 함수 공식 적용
result -= result / p
}
p += 1
}
// n이 소수인 경우
if number > 1 {
result -= result / number
}
return result
}
// 예제 사용
let n = 10
let result = eulerTotientFunction(n)
print("φ(\(n)) =", result) // 출력: φ(10) = 4
코드 설명
위 코드는 스위프트 언어로 작성된 오일러 피 함수의 구현 예시입니다. 주어진 자연수 n에 대해, 다음 순서로 진행합니다:
- 초기화: result에 n을 저장하고, number에 n을 저장한 후, p를 2로 초기화합니다.
- 약수 찾기: p가 number의 제곱보다 작거나 같은 동안 반복합니다. 만약 p가 number의 약수라면, number를 p로 나누어 해당 약수를 모두 제거합니다. 그 후, result에서 p로 나누고 결과를 다시 저장합니다.
- 소수 확인: 마지막으로 number가 1보다 크다면, n은 소수이므로, φ(n) 공식에서 마지막 소수에 대한 처리를 시행합니다.
테스트
위의 알고리즘을 사용하면 다양한 입력에 대해 오일러 피 함수를 빠르고 효율적으로 계산할 수 있습니다. 다음은 몇 가지 다른 테스트 케이스입니다.
let testCases = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100, 1000, 10000, 100000, 1000000]
for case in testCases {
print("φ(\(case)) =", eulerTotientFunction(case))
}
결론
오일러 피 함수는 수론에서 중요한 역할을 하는 개념으로, 스위프트를 이용해 효과적으로 구현할 수 있습니다. 위의 예제를 통해 오일러 피 함수의 정의와 알고리즘적 접근법을 설명하였으며, 추후 더 복잡한 문제로 나아가는 데 토대가 되기를 바랍니다. 스위프트나 다른 프로그래밍 언어에서 이 함수를 구현하며 연습해보세요.
추가 자료
오일러 피 함수에 대한 더 깊이 있는 자료는 다음과 같습니다: