문제 설명
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] |
코드 및 설명
import math
def solution(brown, yellow):
sum_size = brown + yellow
check_arr = []
answer = []
for idx in range(1, sum_size+1):
if sum_size % idx == 0:
check_arr.append(idx)
for idx in range(math.ceil(len(check_arr)/2)):
if (check_arr[idx]-2) * (check_arr[len(check_arr)-(idx+1)]-2) == yellow:
answer.append(check_arr[len(check_arr)-(idx+1)])
answer.append(check_arr[idx])
return answer
처음 이 문제를 접했을 때 brown의 값과 yellow의 값을 더한 약수를 구하고, 제일 중간에서 매칭되는 값 즉 [1,2,4,8] 이렇다면, 2하고 4를 추출하여 정렬해서 보여주면 된다고 생각했다. 하지만 이 방식으로 코드를 짰을 때 문제점이 좀 있었다. 조건 혹은 문제가 약간 이해하기 어렵게 되어있는 것 같은 데 그림에서 보면 브라운 테두리가 위로 1, 밑으로 1, 왼쪽 1, 오른쪽 1씩 노란부분을 감싸고 있다. 즉 중간에 값을 추출한 다음 두 수에서 -2를 한 후 곱했을 때 yellow 값과 같지 않으면 그 추출값은 정답이 아니라는 뜻이 된다. 고로 약수로 전체 길이에서 반으로 나누고 그 값을 반복문을 돌리는 데 차례로 한칸씩(서로 왼쪽으로한칸, 오른쪽으로 한칸) 이동하면서 yellow와 같은 값이 되는 지를 찾으면 되는 문제이다.
'삽집하는 개발들 > 알고리즘' 카테고리의 다른 글
[59일차][Lv2][프로그래머스][탐욕법(Greedy)][42885]구명보트 (110) | 2023.09.21 |
---|---|
[58일차][Lv2][프로그래머스][Summer/Winter Coding(~2018)][12981]영어 끝말잇기 (53) | 2023.09.18 |
[56일차][Lv2][프로그래머스][2017 팁스타운][12973]짝지어 제거하기 (7) | 2023.09.14 |
[55일차][Lv2][프로그래머스][12945]피보나치 수 (5) | 2023.09.09 |
[54일차][Lv2][프로그래머스][12911]다음 큰 숫자 (6) | 2023.09.08 |