λ°˜μ‘ν˜•
Notice
Recent Posts
Recent Comments
Link
Β«   2024/05   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-02 06:48
관리 메뉴

재λƒ₯이😻

[파이썬/Python] λ°±μ€€ 2609번 μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜ λ³Έλ¬Έ

Solved.ac - Python/CLASS 2

[파이썬/Python] λ°±μ€€ 2609번 μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜

ImJay 2023. 5. 8. 03:02
λ°˜μ‘ν˜•

[파이썬/Python] λ°±μ€€ 2609번 μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜

 

2609번: μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜

첫째 μ€„μ—λŠ” μž…λ ₯으둜 주어진 두 수의 μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό, λ‘˜μ§Έ μ€„μ—λŠ” μž…λ ₯으둜 주어진 두 수의 μ΅œμ†Œ 곡배수λ₯Ό 좜λ ₯ν•œλ‹€.

www.acmicpc.net


문제

두 개의 μžμ—°μˆ˜λ₯Ό μž…λ ₯λ°›μ•„ μ΅œλŒ€ κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œ 곡배수λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 μ€„μ—λŠ” 두 개의 μžμ—°μˆ˜κ°€ 주어진닀. 이 λ‘˜μ€ 10,000μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ©° 사이에 ν•œ 칸의 곡백이 주어진닀.

좜λ ₯

첫째 μ€„μ—λŠ” μž…λ ₯으둜 주어진 두 수의 μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό, λ‘˜μ§Έ μ€„μ—λŠ” μž…λ ₯으둜 주어진 두 수의 μ΅œμ†Œ 곡배수λ₯Ό 좜λ ₯ν•œλ‹€.

예제 μž…λ ₯

24 18

예제 좜λ ₯

6
72

풀이 1

import sys

# ν‘œμ€€ μž…λ ₯ λŒ€μ‹  sys.stdin.readline()을 μ‚¬μš©ν•˜μ—¬ μž…λ ₯ 속도 ν–₯상
input = sys.stdin.readline

# 두 개의 μ •μˆ˜λ₯Ό μž…λ ₯λ°›μ•„ n1, n2에 ν• λ‹Ή
n1, n2 = map(int, input().split())

# 큰 값을 a에, μž‘μ€ 값을 b에 ν• λ‹Ή
a = max(n1, n2)
b = min(n1, n2)

# b의 μ•½μˆ˜λ₯Ό μ°Ύμ•„μ„œ lst λ¦¬μŠ€νŠΈμ— μΆ”κ°€
lst = []
for i in range(1, b + 1):
    if b % i == 0:
        lst.append(i)

# lst λ¦¬μŠ€νŠΈμ—μ„œ a의 μ•½μˆ˜μΈ κ°€μž₯ 큰 값을 μ°Ύμ•„μ„œ 좜λ ₯
for i in reversed(lst):
    if a % i == 0:
        print(i)
        break

# 두 수의 곡배수λ₯Ό κ΅¬ν•˜λŠ” κ³Όμ •
cnt1 = 1
cnt2 = 1
while True:
    if cnt1 * a == cnt2 * b: # 두 수의 곡배수λ₯Ό 찾으면 좜λ ₯ν•˜κ³  μ’…λ£Œ
        print(cnt1 * a)
        break
    elif cnt1 * a < cnt2 * b: # cnt1 * aκ°€ μž‘μœΌλ©΄ cnt1 증가
        cnt1 += 1
    else: # cnt1 * aκ°€ 크면 cnt2 증가
        cnt2 += 1

 

이 μ½”λ“œμ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(n log n)이닀.

max() ν•¨μˆ˜μ™€ min() ν•¨μˆ˜ ν˜ΈμΆœμ€ O(1) μ‹œκ°„에 μˆ˜ν–‰λœλ‹€.
lst λ¦¬μŠ€νŠΈμ—λŠ” b의 μ•½μˆ˜κ°€ μ €μž₯λ˜λ―€λ‘œ, λ¦¬μŠ€νŠΈμ˜ ν¬κΈ°λŠ” b의 μ•½μˆ˜μ˜ κ°œμˆ˜(b의 μ•½μˆ˜μ˜ μ΄ κ°œμˆ˜λŠ” O(μ•½μˆ˜μ˜ κ°œμˆ˜))이닀. λ”°λΌμ„œ μ•½μˆ˜λ₯Ό μ°ΎλŠ” for λ£¨ν”„μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(μ•½μˆ˜μ˜ κ°œμˆ˜)κ°€ λœλ‹€.
for i in reversed(lst): λ£¨ν”„μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” μ•½μˆ˜μ˜ κ°œμˆ˜μ™€ κ΄€λ ¨μ΄ μžˆλ‹€. λ”°λΌμ„œ μ΄ λΆ€λΆ„μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(μ•½μˆ˜μ˜ κ°œμˆ˜)이닀.
while λ£¨ν”„λŠ” μ΅œμ•…μ˜ κ²½μš° cnt1 * cnt2번 λ°˜λ³΅λœλ‹€. μ΄ λ£¨ν”„ μ•ˆμ—μ„œ μˆ˜ν–‰λ˜λŠ” λΉ„ꡐ μ—°μ‚°(cnt1 * a == cnt2 * b, cnt1 * a < cnt2 * b)은 O(1) μ‹œκ°„에 μˆ˜ν–‰λœλ‹€. λ”°λΌμ„œ while λ£¨ν”„μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(cnt1 * cnt2)κ°€ λœλ‹€.
cnt1κ³Ό cnt2λŠ” while λ£¨ν”„ μ•ˆμ—μ„œ κ°κ° 1μ”© μ¦κ°€ν•˜λ―€λ‘œ, μ΅œμ•…μ˜ κ²½μš° cnt1κ³Ό cnt2의 μ΅œλŒ“값은 a와 b의 μ°¨μ΄(|a-b|)이닀. λ”°λΌμ„œ while λ£¨ν”„μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(a * b)κ°€ λœλ‹€.
λ”°λΌμ„œ, μ΄ μ½”λ“œμ˜ μ „체적인 μ‹œκ°„ λ³΅μž‘λ„λŠ” O(n log n) + O(n) + O(n) = O(n log n)이닀. (단, n은 max(n1, n2)와 min(n1, n2) μ€‘ ν° κ°’을 μ˜λ―Έν•œλ‹€.)

이 μ½”λ“œλŠ” λ‘ μˆ˜μ˜ μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜λ₯Ό μ°ΎλŠ” λ°μ— μžˆμ–΄μ„œ λΉ„ꡐ적 κ°„λ‹¨ν•˜κ³  μ§κ΄€μ μœΌλ‘œ κ΅¬ν˜„λ˜μ–΄ μžˆλ‹€. κ·ΈλŸ¬λ‚˜ ν° μˆ˜μ— λŒ€ν•΄μ„œλŠ” μ•½μˆ˜λ₯Ό μ°ΎλŠ” λΆ€λΆ„μ—μ„œ μ‹œκ°„ λ³΅μž‘도가 μƒλ‹Ήνžˆ μ»€μ§€λ―€λ‘œ, λ‘ μˆ˜κ°€ λ§€μš° ν° κ²½μš°μ—λŠ” μ²˜λ¦¬ μ†λ„κ°€ λŠλ €μ§ˆ μˆ˜ μžˆλ‹€. μ΄λŸ° κ²½μš°μ—λŠ” λ³΄λ‹€ νš¨μœ¨μ μΈ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜λŠ” κ²ƒμ΄ μ’‹λ‹€.

풀이 2

μœ ν΄λ¦¬λ“œ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό κ΅¬ν•  μˆ˜ μžˆλ‹€. μœ ν΄λ¦¬λ“œ μ•Œκ³ λ¦¬μ¦˜μ€ λ‘ μˆ˜μ˜ μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό κ΅¬ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ, ν° μˆ˜λ₯Ό μž‘은 μˆ˜λ‘œ λ‚˜λˆ„μ–΄ λ‚˜λ¨Έμ§€λ₯Ό κ΅¬ν•˜κ³ , λ‚˜λ¨Έμ§€κ°€ 0이 μ•„λ‹ˆλ©΄ μž‘은 μˆ˜λ₯Ό λ‚˜λ¨Έμ§€λ‘œ, λ‚˜λ¨Έμ§€κ°€ 0이면 κ·Έ λ•Œμ˜ μž‘은 μˆ˜κ°€ λ‘ μˆ˜μ˜ μ΅œλŒ€κ³΅μ•½μˆ˜μ΄λ‹€.

μ΅œμ†Œκ³΅λ°°μˆ˜λŠ” λ‘ μˆ˜μ˜ κ³±μ„ μ΅œλŒ€κ³΅μ•½μˆ˜λ‘œ λ‚˜λˆˆ κ°’이닀.

μ•„λž˜λŠ” μœ ν΄λ¦¬λ“œ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜λ₯Ό κ΅¬ν•˜λŠ” μ½”λ“œμ΄λ‹€.

import sys
input = sys.stdin.readline

n1, n2 = map(int, input().split())

# μœ ν΄λ¦¬λ“œ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό ꡬ함
a, b = n1, n2
while b != 0:
    a, b = b, a % b
gcd = a

# μ΅œμ†Œκ³΅λ°°μˆ˜λ₯Ό ꡬ함
lcm = n1 * n2 // gcd

print(gcd)
print(lcm)

μœ„ μ½”λ“œμ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό κ΅¬ν•˜λŠ” λΆ€λΆ„μ—μ„œ O(log(min(n1, n2)))이고, μ΅œμ†Œκ³΅λ°°μˆ˜λ₯Ό κ΅¬ν•˜λŠ” λΆ€λΆ„μ—μ„œλŠ” O(1)이닀. λ”°λΌμ„œ μ „체적인 μ‹œκ°„ λ³΅μž‘λ„λŠ” O(log(min(n1, n2)))이닀. μœ ν΄λ¦¬λ“œ μ•Œκ³ λ¦¬μ¦˜μ€ λ‘ μˆ˜ μ€‘ μž‘은 μˆ˜μ˜ λŒ€λž΅μ μΈ μžλ¦Ώμˆ˜μ— λΉ„λ‘€ν•˜λŠ” νšŸμˆ˜λ§ŒνΌμ˜ μ—°μ‚°μ„ μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ—, ν° μˆ˜μ—μ„œλ„ λΉ λ₯Έ μ‹œκ°„에 μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό κ΅¬ν•  μˆ˜ μžˆλ‹€.

참고자료

 

μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•(Euclidean-algorithm)

μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•μ— λŒ€ν•΄ μ•Œμ•„λ³΄μž.

velog.io

 

파이썬의 reversed() ν•¨μˆ˜λ‘œ 거꾸둜 루프 돌리기 (vs. slicing μ—°μ‚°μž & reverse() ν•¨μˆ˜)

Engineering Blog by Dale Seo

www.daleseo.com

λ°˜μ‘ν˜•
Comments