Study/Baekjoon Online Judge

[백준/파이썬] 1850. 최대공약수

growingtree 2021. 7. 24. 18:15

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

문제

모든 자리가 1로만 이루어져있는 두 자연수 A와 B가 주어진다. 이때, A와 B의 최대 공약수를 구하는 프로그램을 작성하시오. 예를 들어, A가 111이고, B가 1111인 경우에 A와 B의 최대공약수는 1이고, A가 111이고, B가 111111인 경우에는 최대공약수가 111이다.

 

입력

첫째 줄에 두 자연수 A와 B를 이루는 1의 개수가 주어진다. 입력되는 수는 263보다 작은 자연수이다.

 

출력

첫째 줄에 A와 B의 최대공약수를 출력한다. 정답은 천만 자리를 넘지 않는다.

 

아이디어

약간의 꼼수?

 

해결과정

 

1. 맨처음 생각한 방법 : 주어진 입력값에다가 문자열 "1"을 곱해서 최대 공약수를 구하자. 

쓰디쓴 메모리 에러 

아무래도 문자열 "1"에 500000000000000000 라는 수를 곱하다보니 메모리에러가 발생한 것 같다. 

#초기 코드

import math
import sys 

A,B = map(int, sys.stdin.readline().split(" "))
A = "1"*A
B = "1"*B

print(math.gcd(int(A),int(B)))

 

2. 두 번째 생각한 방법 : 문자열 "1"을 최대공약수만큼 반복해서 출력하자. 

맨처음 생각한 방법은 문자"1" 에다가 입력값을 곱하고 난다음 최대공약수를 구했다면, 이번엔 애초에 최대공약수를 구하고난 값에 문자열 "1"을 곱하자. -> 숫자의 크기가 줄어드니까 제대로 출력이 될 수 있지 않을까? 

입력으로 3과 6이 주어졌을 때 최대 공약수는 3이니 출력은 1이 총 3번 반복된 111이 출력이 되게끔!! ex) "1"*3 -> "111"

 

코드

import math
import sys 

A,B = map(int, sys.stdin.readline().split(" "))

print(math.gcd(A,B)*"1")

 

해설

import math # 표준모듈 math import 
import sys # 표준모듈 sys import 
 
A,B = map(int, sys.stdin.readline().split(" ")) # stdin.readline을 사용해서 두 수 입력받기 

# math모듈에 gcd 메소드는 입력으로 들어온 두 수의 최대공약수를 리턴해준다. 
# 리턴된 최대공약수에 문자열 "1" 곱하기 

print(math.gcd(A,B)*"1")

 

반응형