본문 바로가기
코딩테스트

[프로그래머스] 완전탐색 - 카펫

by 박매트 2024. 3. 18.

 

 

나의 답

def check(brown, yellow,x,y):
    b = x*y-((x-2)*(y-2))
    y = (x-2)*(y-2)
    
    if brown == b and yellow == y:
        return 1
    else:
        return 0
    
def solution(brown, yellow):
    cnt = brown+yellow
    
    arr = []
    
    for i in range(3,cnt+1): # 약수 구하기
        if cnt%i==0:
            arr.append(i)
            
    for value in arr: # 약수 조합 활용
        x = value
        y = int(cnt/value)
        if check(brown, yellow,x,y): # 가로, 세로 값에 따라서 brown, yellow 충족 확인
            return [x,y] if x>y else [y, x]
    return 0

 

약수를 활용해서 문제 풀었다....

가로, 세로 값에 따라서 충족 확인Ss.

 

다른 사람 풀이

거의 다들 약수를 이용해서 풀었는데 근의 공식을 이용해서 푼 풀이가 있었따  .. . 

import math
def solution(brown, yellow):
    w = ((brown+4)/2 + math.sqrt(((brown+4)/2)**2-4*(brown+yellow)))/2
    h = ((brown+4)/2 - math.sqrt(((brown+4)/2)**2-4*(brown+yellow)))/2
    return [w,h]

x^2-(a+b)x + ab = 0 이런식으로 되어있었다 라고 생각한다면,

 

brown = a*b - ((a-2)*(b-2)) = -4 +2(a+b) 

-> a+b = (brown+4)/2 라는 것을 알 수 있음

 

brown + yellow -> 전체 면적 수 == 넓이 == 근의 곱 (a*b)

 

a+b => 근의 합 : (brown+4)/2 가 되는 것이고

ab => 근의 곱 : (yellow+brown)이 되는 것

 

그래서 a, b의 해를 구할 수 있고, a는 가로, b는 세로가 된다. 와 . . .