프로그래머스 카펫 [ Python ]

2023. 7. 9. 20:20알고리즘/프로그래머스

문제 설명
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

출처 : 프로그래머스

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

 

Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow 가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.



제한사항
- 갈색 격자의 수 brown 은 8 이상 5,000 이하인 자연수 입니다.
- 노란색 격자의 수 yellow 는 1 이상 2,000,000 이하인 자연수 입니다.
- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.



입출력 예

brown yellow return
10 2 [4, 3]
8 1 [3, 3]
24 24 [8, 6]

코드

 

def solution(brown, yellow):
    width = brown / 2 + 1
    height = 1

    while width >= height:
        if (width - 2) * (height - 2) == yellow:
            return [int(width), int(height)]
        width -= 1
        height += 1


print(solution(10, 2))

 

감명깊었던 다른분 코드

 

import math
def calculate_width(brown, size):
    discriminant = (2 + brown/2) ** 2 - 4  * size # 판별식

    if discriminant == 0:
        w = (2 + brown/2) / 2
        return w

    if discriminant > 0:
        w = ((2 + brown/2) + math.sqrt(discriminant)) / 2
        return w

def solution(brown, yellow):
    size = brown + yellow

    width = calculate_width(brown, size)
    height = size / width

    answer = [width, height]
    return answer

회고

 

확실히 반복문을 안돌린 수학을 활용한 코드가 더 빨랐다.

수학을 잘 모르는 내자신이 아쉽지만 풀었다는 것 만으로도 기분이 좋았다.

처음 문제를 접했을때 brown 과 yellow 를 더한 후 그 결과값을 찾으려 했지만 더 이상 방법이 떠오르지 않아 포기했다.

이후 yellow 를 기준으로 바꾸었고 yellow 주변에는 두개의 width 와 height 밖에 없다. 

이 특징을 이용해 결과를 구할 수 있었다.

 

추가로 블로그에 다 못올린 프로그래머스 문제는 개인 Github 에 올리고있다. 아래에 링크남긴다.

https://github.com/munyeol-Yoon/programmers-prac

 

GitHub - munyeol-Yoon/programmers-prac

Contribute to munyeol-Yoon/programmers-prac development by creating an account on GitHub.

github.com