BoJ 3036 ring [python]

정현종·2022년 9월 16일
0

BoJ

목록 보기
3/5

문제
상근이는 창고에서 링 N개를 발견했다. 상근이는 각각의 링이 앞에 있는 링과 뒤에 있는 링과 접하도록 바닥에 내려놓았다.
상근이는 첫 번째 링을 돌리기 시작했고, 나머지 링도 같이 돌아간다는 사실을 발견했다. 나머지 링은 첫 번째 링 보다 빠르게 돌아가기도 했고, 느리게 돌아가기도 했다. 이렇게 링을 돌리다 보니 첫 번째 링을 한 바퀴 돌리면, 나머지 링은 몇 바퀴 도는지 궁금해졌다.
링의 반지름이 주어진다. 이때, 첫 번째 링을 한 바퀴 돌리면, 나머지 링은 몇 바퀴 돌아가는지 구하는 프로그램을 작성하시오.

입력
첫째 줄에 링의 개수 N이 주어진다. (3 ≤ N ≤ 100)
다음 줄에는 링의 반지름이 상근이가 바닥에 놓은 순서대로 주어진다. 반지름은 1과 1000를 포함하는 사이의 자연수이다

출력
출력은 총 N-1줄을 해야 한다. 첫 번째 링을 제외한 각각의 링에 대해서, 첫 번째 링을 한 바퀴 돌리면 그 링은 몇 바퀴 도는지 기약 분수 형태 A/B로 출력한다.

문제 해결 아이디어
처음에는 소인수 분해를 해서 리스트에 삽입한뒤, 나뉘는것과 나누는것 각각의 리스트중 공통된것을 지우고, 다시 곱셈을 하려했다.
하지만 고민해본 결과 최대 공약수를 구해서 나누어 주기만 하면 쉽게 풀리는 문제였다.

import sys

def rotating(child, parent):
arrC = []
arrP = []
ans = 1
#약수를 구해준다.
for i in range(1, child//2 + 1):
  if child%i == 0:
    arrC.append(i)
    arrC.append(child//i)
for i in range(1, parent//2 +1):
  if parent%i == 0:
    arrP.append(i)
    arrP.append(parent//i)
 #약수중 공통된 수를 찾아주는데, 그 수가 더 커지면 갱신한다. 
for i in arrP:
  if i in arrC:
    if i> ans:
      ans = i
print(child//ans, '/', parent//ans, sep = '')
return 0

n = int(sys.stdin.readline().rstrip())

arr = list(map(int, sys.stdin.readline().rstrip().split()))

for i in range(n-1):
rotating(arr[0], arr[i+1])
profile
hello~ I want to share code with you~

0개의 댓글