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
'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 피자 나눠 먹기(1) [ Python ] (0) | 2023.04.19 |
---|---|
프로그래머스 배열의 평균값 [ Python ] (0) | 2023.04.19 |
프로그래머스 머쓱이보다 키 큰 사람 [ Python ] (0) | 2023.04.18 |
프로그래머스 연속된 수의 합 [ Python ] (0) | 2023.04.18 |
프로그래머스 중복된 숫자 개수 [ Python ] (0) | 2023.04.18 |