[Algorithm] 백준 - 11689번 GCD(n, k) = 1

2024. 7. 9. 14:00· → Problems
목차
  1. 문제 소개
  2. 풀이 과정

문제 소개

https://www.acmicpc.net/problem/11689

 

풀이 과정

자연수의 범위가 10^12이다. 절대로 1부터 순회해서 서로소를 구할 수 없다. 물론 소수를 구하게 된다면 좀 더 수월해지겠지만 순회하는 방식으로는 도저히 구할 수가 없다는 것을 알게 되었고, 결국 오일러의 피 함수를 찾아보게 되었다. 소인수를 통해 서로소의 개수를 구할 수 있는 함수이다.

 

 

오일러 피 함수 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 오일러 파이 함수의 그래프. ϕ(1)부터 ϕ(1000)까지의 값들을 나타낸다. 수론에서 오일러 파이 함수(-函數, 영어: Euler’s phi (totient) function)는 정수환의 몫환의 가

ko.wikipedia.org

 

공식을 알고나니 구현하기는 너무 쉬웠다. 주의해야 할 사항은 root를 기준으로 반복문을 돌려줬는데 n보다 작고 root보다 큰 소인수는 하나 존재할 수 있다. 두 개 이상 존재하면 무조건 n보다 커지기 때문에... 그래서 마지막에 n이 1이 되지 않는다면 서로소라고 생각하고 오일러 곱 공식을 한번 더 적용한다.

import Foundation

// 에라토스테네스의 체
var n = Int(readLine()!)!
let root = Int(sqrt(Double(n)) + 1)

var isPrime = Array(repeating: true, count: root + 1)
guard n > 1 else {
    print(1)
    exit(0)
}

for i in 2...root {
    guard isPrime[i] else { continue }
    var k = i * i
    while k <= root {
        isPrime[k] = false
        k += i
    }
}

// 오일러 피함수
var phi = n
for p in 2...root {
    guard isPrime[p] else { continue }
    if n % p == 0 {
        phi = phi / p * (p - 1)
    }
    while n % p == 0 {
        n /= p
    }
}

print(n == 1 ? phi : phi / n * (n-1))

 

성능은 아주 좋은 듯 하다.

'→ Problems' 카테고리의 다른 글

[Algorithm] 백준 - 11660번 구간 합 구하기 5 (Swift)  (0) 2024.07.28
[Algorithm] 백준 - 2098번 외판원 순회 (Swift)  (0) 2024.07.28
[Algorithm] 백준 - 16565번 포커 (Swift)  (0) 2024.07.08
[Algorithm] 백준 - 15824번 너 봄에는 캡사이신이 맛있단다 (Swift)  (0) 2024.07.07
[Algorithm] 백준 - 1334번 철로 (Swift)  (0) 2024.07.07
  1. 문제 소개
  2. 풀이 과정
'→ Problems' 카테고리의 다른 글
  • [Algorithm] 백준 - 11660번 구간 합 구하기 5 (Swift)
  • [Algorithm] 백준 - 2098번 외판원 순회 (Swift)
  • [Algorithm] 백준 - 16565번 포커 (Swift)
  • [Algorithm] 백준 - 15824번 너 봄에는 캡사이신이 맛있단다 (Swift)
Swift librarian
Swift librarian
Swift librarian
Swift Library
Swift librarian
전체
오늘
어제
  • 분류 전체보기 (231)
    • 📺 Programming (5)
    • → Architecture (2)
    • → Design Pattern (0)
    • → Computer Science (15)
    • ⚙️ Algorithm (0)
    • → 알고리즘 관련 (22)
    • → Problems (104)
    • 🚀 Project (0)
    • → 알쏭달쏭 (0)
    • → Shook (2)
    • → Solver (8)
    • → Taster (7)
    • → Outline (4)
    • → Pointer (2)
    • → Guesser (3)
    • 🦜 Swift (2)
    • → Swift Archive (12)
    • → Swift Study (12)
    • → Xcode (6)
    • 🧰 Framework (0)
    • → Foundation (1)
    • → UIKit (2)
    • → SwiftUI (3)
    • → CoreData (2)
    • → MapKit (1)
    • → CoreHaptic (1)
    • → User Notification (1)
    • → StoreKit (2)
    • 🏛️ Library (0)
    • → TCA (0)
    • 🐈‍⬛ Git (8)
    • → Git의 원리 (2)
    • → Git 심화 (1)
    • 📦 Other (1)
    • 👦🏻 Log (0)

최근 글

hELLO · Designed By 정상우.v4.2.2
Swift librarian
[Algorithm] 백준 - 11689번 GCD(n, k) = 1
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.