728x90
🔗 프로그래머스 - 카펫
이 문제는 연립 일차 방정식을 푸는 문제다.
노란색 부분의 가로를 x, 세로를 y라고 하면
x >= y 이여야 하고 x * y = yellow , 2 * (x + 2) + 2 * y = brown 이다
여기에서 파이썬 symPy라는 라이브러리를 발견해 적어보려고 한다.
코테에서는 사용이 아마 불가하겠지만 유용한거 같아 기록해본다!!
symPY 는 수학 라이브러리로 다항식과 같이 수학연산을 하기 위한 라이브러리다.
이 라이브러리를 사용하여 문제를 풀면
import sympy
def solution(brown, yellow):
answer = []
# 노란색 부분의 가로를 x, 세로를 y라고 하면
# x >= y 이여야 하고 x * y = yellow , 2 * (x + 2) + 2 * y = brown 이다
# 방정식을 풀어서 적용해보면
x, y = sympy.symbols('x y')
f1 = sympy.Eq(x * y, yellow)
f2 = sympy.Eq(2 * (x + 2) + 2 * y, brown)
sol = sympy.solve((f1, f2), dict=True)
def x_is_bigger(dict_xy):
if dict_xy[x] >= dict_xy[y]:
return True
return False
sol = list(filter(x_is_bigger, sol))[0]
return [sol[x] + 2, sol[y] + 2]
이렇게 풀 수 있고 라이브러리가 의도하는 것처럼 굉장히 간단하고 직관적으로 코드를 작성 할 수 있다. 하지만...
코테 사이트에서는 해당 라이브러리를 찾을 수 없으므로.
x * y = yellow 는 for문을 돌면서 약수를 찾는 것으로 해결했고,
찾은 수들을 기반으로 2 * (x + 2) + 2 * y = brown를 만족하는 지 찾았다.
def solution(brown, yellow):
answer = []
# 노란색 부분의 가로를 x, 세로를 y라고 하면
# x >= y 이여야 하고 x * y = yellow , 2 * (x + 2) + 2 * y = brown 이다
# x * y 인 수를 구하기 위해 약수를 구한다.
candidate = {}
if yellow == 1:
candidate[1] = 1
for x in range(1, yellow):
y = yellow // x
remain = yellow % x
if not remain:
if x < y:
temp = x
x = y
y = temp
candidate[x] = y
# 2 * (x + 2) + 2 * y = brown 를 계산해서 값을 구한다.
for x, y in candidate.items():
if 2 * (x + 2) + 2 * y == brown:
return [x + 2, y + 2]
return answer
728x90
'코딩테스트' 카테고리의 다른 글
프로그래머스 타켓 넘버 파이썬 (0) | 2024.05.30 |
---|---|
프로그래머스 - 소수찾기 (0) | 2024.05.29 |
프로그래머스: H-index (0) | 2024.05.27 |
프로그래머스 가장 큰 수 (0) | 2024.05.26 |
LeetCode - 2336. Smallest Number in Infinite Set (0) | 2024.05.25 |