코딩테스트

프로그래머스 - 카펫

yolang 2024. 5. 28. 14:19
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