뚝딱햄 탈출기

[Python][프로그래머스 lv.0] 120808. 분수의 덧셈 : 최대공약수 본문

Algorithm & Data structure/알고리즘 문제 풀이

[Python][프로그래머스 lv.0] 120808. 분수의 덧셈 : 최대공약수

hyrmzz1 2023. 10. 3. 17:57

JS로 풀 때도 너무너무 어려웠던 분수의 덧셈 .. 파이썬으로 풀어도 역시나 어려웠다.

내 풀이

def solution(numer1, denom1, numer2, denom2):   # 분자: numer, 분모: denom
    denom = denom1 * denom2
    numer = numer1 * denom2 + numer2 * denom1
    # 기약분수 만들기
    	# denom과 numer의 최대공약수 구하기
        # 최대공약수로 denom과 numer를 각각 나누고, 그 몫을 denom과 numer에 할당
    # return [numer, denom]

통분할 때 두 분수의 분모가 같은 경우와 다른 경우를 고려하지 않고 두 분모를 곱해주었다.

통분된 분수를 최대공약수로 분모와 분자를 각각 나눠 기약분수로 만들기 위해 정말 많이 고민했다. 반복문을 사용하는게 아닐까 싶었지만 도저히 모르겠어서 다른 분들의 풀이를 참고했다. 레벨 0은 혼자 힘으로 풀고 싶던 나 ......... 눈물을 머금고 검색

solution 1

최대공약수를 구할 수 있는 함수 gcd()를 사용한다.

gcd() 함수는 내장함수가 아닌 math 라이브러리에 속한 함수이기 때문에 math 라이브러리를 import 해야 한다.

import math
math.gcd()

gcd의 인자로 숫자들을 입력할 수 있는데, 인자는 0개부터 N개까지 올 수 있다.

인자로 들어온 숫자들의 최대 공약수(정수)를 반환한다.

인자가 0개이거나, 모든 인자의 값이 0이면 함수의 반환값은 0이다.

import math

def solution(numer1, denom1, numer2, denom2):   # 분자: numer, 분모: denom
    denom = denom1 * denom2
    numer = numer1 * denom2 + numer2 * denom1

    gcd = math.gcd(denom, numer)    # 최대 공약수
    return [numer / gcd, denom / gcd]	# 최대 공약수로 분자와 분모를 나눠 기약분수 만들기

solution 2

내가 구현하고자 했던 풀이다!

for문에서 stride를 음수로 지정하는 것을 생각하지 못했다.

for문에서 통분 후의 분모와 분자 (denom, numer) 중 작은 것을 기준으로 1씩 감소하는 i로 분모와 분자를 나눴을 때, 나머지가 나오지 않는 수(= 공약수)를 찾는다.

break문이 있기 때문에 최대공약수만을 찾고 (s에 최대공약수 값을 대입하고) 바로 반복문이 종료된다.

그 후 최대공약수로 통분 후의 분모와 분자 (denom, numer) 를 각각 나누어 준다.

def solution(denom1, numer1, denom2, numer2):	# numer: 분자, denom: 분모
    answer = []
    denom = denom1 * denom2
    numer = numer1 * denom2 + numer2 * denom1
	
    # 최대공약수 찾기
    s = 0
    for i in range(min(denom,numer), 0, -1):
        if denom % i == 0 and numer % i == 0:
            s = i
            break

    denom /= s
    numer /= s
    answer.append(denom)
    answer.append(numer)

    return answer

 


https://school.programmers.co.kr/learn/courses/30/lessons/120808

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

Comments