선발대

[스파르타] 99클럽 2기 코테스터디 9일차 TIL / 카펫 본문

스파르타코딩클럽/활동 내용

[스파르타] 99클럽 2기 코테스터디 9일차 TIL / 카펫

신선한 스타트 2024. 5. 28. 23:55

프로그래머스: 카펫 (링크)

카펫

 

예전에 간단하게 풀었던 기억이 있는데 다시 그 풀이를 보니까 주석이 없어서 왜 이런 식으로 되는지 이해를 못 했다. 과거의 내가 더 똑똑한 걸까? 대체 어떻게 한 거지? 계속 봐도 기억이 안 나서 그냥 아예 새로운 방식으로 다시 풀었다.

 

이번에는 근의 공식을 이용해서 풀었다. 갈색 카펫과 노란색 카펫의 각각의 가로, 세로를 Bx, By, Yx, Yy 라고 한다면 아래와 같은 관계식이 성립하게 된다. 카펫의 개수는 각각 B, Y로 지정했다.

 

1. Bx * By = B + Y

2. Bx = Yx + 2, By = Yy + 2 --> Bx * By = (Yx + 2) * (Yy + 2) = YxYy + 2(Yx + Yy) + 4

3. Y = Yx * Yy

 

위의 식을 정리해보면 Bx * By = B + Y = B + (Yx * Yy) =  2(Yx + Yy) + 4가 되므로, Yx + Yy = (B-4) // 2이다.

Yy = (B-4) // 2 - Yx 식을 Y = Yx * Yy에 넣으면 Y = Yx * ( (B-4)//2 - Yx)가 되고 Yx에 대해 정리해 주면,

Yx^2 - ((B-4) // 2)Yx + Y = 0 이 되므로 근의 공식을 써서 풀 수 있다.

 

## 근의 공식으로 풀이
def solution(brown, yellow):

    a = 1
    b = -(brown-4)//2
    c = yellow
    
    Yx = (-b+(b**2-4*a*c)**(1/2)) // 2 # 근의 공식
    Yy = yellow // Yx # 가로 알면 세로도 알 수 있음
    
    return [Yx+2, Yy+2]
    
    
## 예전 풀이
def solution(brown, yellow):
    brown = (brown - 4) // 2
    yellow_list = [i for i in range(1, brown) if i * (brown - i) == yellow]
    return [max(yellow_list) + 2, min(yellow_list) + 2]

오늘 미들러 풀이 끝!

Comments