본문 바로가기
PS/programmers

[Lv. 2] 카펫(Python)

by 강렬한 스포트라이트 2023. 7. 11.

안녕하세요. 

강렬한 스포트라이트 입니다!

 

하기의 문제를 Python 언어를 사용하여 구현하고자 합니다.

 

<문제 설명>

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]

 

<해결 코드>

 

brown과 yellow를 모두 더한 값이 해당 카펫의 넓이가 되고, 가로와 세로의 곱은 넓이에 해당하므로

넓이에 대한 약수를 먼저 구합니다. 이후 가로는 세로보다 길이가 긴 조건을 적용하여 필터링합니다.

필터링된 리스트의 값은 brown의 가로, 세로 값에 해당이 됩니다. 따라서 식을 적용한 값이 주어진 brown의

값과 동일할 경우, [가로, 세로] 를 반환합니다.

def solution(brown, yellow):
    total = brown + yellow
    total_list = [] #total의 약수를 담는 리스트
    for i in range(3,(total//2)): #가로, 세로는 3 이상부터 가능함
        if total%i == 0:
            total_list.append([total//i,i])
    filter_list = [] #가로(x)가 세로(y)보다 긴 리스트를 담는다.
    for x,y in total_list:
        if x>=y:
            filter_list.append([x,y])
    for a,b in filter_list:
        if a*2 + b*2 - 4 == brown:
            return [a,b]

 

위 과정에서 가로가 세로보다 긴 조건과 계산식 조건을 모두 충족하는 경우를 반환하여,

filter_list 를 별도로 선언해주지 않고도 하나의 for문 안에서 문제를 해결할 수 있습니다.

 

def solution(brown, yellow):
    total = brown + yellow
    total_list = [] #total의 약수를 담는 리스트
    for i in range(3,(total//2)): #가로, 세로는 3 이상부터 가능함
        if total%i == 0:
            total_list.append([total//i,i])
    for x,y in total_list:
        if x>=y and (x*2+y*2-4)==brown:
            return [x,y]

 

 

해보시고 문의사항이 있으시면 댓글로 남겨주세요.
감사합니다!

 

 

반응형
SMALL

'PS > programmers' 카테고리의 다른 글

[Lv. 2] N개의 최소공배수  (0) 2023.07.17
[Lv. 2] 피보나치 수(Python)  (0) 2023.07.12
[Lv. 2] 의상(Python)  (0) 2023.07.10
[Lv. 2] 올바른 괄호(Python)  (0) 2023.05.19
[Lv. 2] 다음 큰 숫자(Python)  (0) 2023.05.04