일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 파이썬 자료형
- 이것이 취업을 위한 코딩테스트다
- 자료형
- 북클럽
- 컴퓨터 동작방식
- 컴퓨터네트워크
- icmp
- 라우팅
- 데이터 통신과 컴퓨터 네트워크
- CS
- GIT
- 시스템 소프트웨어
- 리스트
- 노개북
- RARP
- sort()
- ARP
- 이코테
- 노마드코더
- 기억장치
- 쿠키
- 데이터통신
- 이것이 취업을 위한 코딩 테스트다
- 파이썬 연산자
- 파이썬 정렬
- DP
- IT5분잡학사전
- data type
- OSI7계층모델
- 쉽게 배우는 데이터 통신과 컴퓨터 네트워크
- Today
- Total
뚝딱햄 탈출기
[Python][프로그래머스 lv.0] 120808. 분수의 덧셈 : 최대공약수 본문
[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
'Algorithm & Data structure > 알고리즘 문제 풀이' 카테고리의 다른 글
[Python][백준 BOJ Silver V] 1181. 단어 정렬 : 리스트 중복 제거, sort(), 다중 조건 정렬, lambda, 문자열 비교 (1) | 2023.10.16 |
---|---|
[Python][백준 BOJ Bronze II] 1978. 소수 찾기 : for else 문, 하나의 수에 대한 소수 판별 (1) | 2023.10.14 |
[Python][프로그래머스 lv.0] 120809. 배열 두 배 만들기 : for문, 리스트 컴프리헨션 (0) | 2023.10.03 |
[JavaScript][프로그래머스 lv.0] 120809. 배열 두 배 만들기 : map() (0) | 2023.08.11 |
[JavaScript] 엘리스 트랙 - 3, 6, 9 게임 (0) | 2023.08.10 |