카테고리 없음

[프로그래머스] 카펫 - 파이썬(python)

아뵹젼 2022. 9. 7.

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):
    yellow_set = []
    for i in range(1,int(yellow**0.5)+1) :
        if yellow % i == 0 :
            yellow_set.append((yellow//i, i))
    
    for yellow_width, yellow_height in yellow_set :
        width = yellow_width + 2
        height = yellow_height + 2
        if width*2 + (height-2)*2 == brown :
            return [width, height]

 

step 1

  • 노란색 타일의 개수가 주어졌으므로, a x b = 노란색 타일 개수 의 형태를 만든다.
  • 모든 약수는 항상 짝을 이루고, 그 짝끼리 곱한 값이 해당 숫자가 된다. (따라서 제곱근까지만 확인한다면, 그 이후는 이미 앞에서 짝을 이룬 중복된 값)
  • ex) 노란색 타일이 24개 : (1,24) (2,12) (3,8) (4,6)
  • 따라서 노란색 타일 개수의 제곱근까지 반복문을 돌며, yellow 가 i로 나눠진다면, 
  • 몫과 i를 가로,세로의 길이가 될 수 있는 후보 집합에 추가하였다.
  • 몫이 더 크므로 가로, i는 제곱근 이전의 값이므로 항상 가로보다 작거나 같은 세로가 된다.

 

step 2

  • 노랑색의 가로, 세로 길이가 될 수 있는 후보 집합의 원소들을 하나씩 돌면서,
  • 해당 값으로 타일의 전체 가로, 세로 길이를 구한다.
  • 타일 전체 가로 = 노란 타일 + 2
  • 타일 전체 세로 = 노란 타일 + 2
  • 따라서 타일가로 * 2 + (타일세로-2)*2 가 갈색의 타일 개수와 일치하다면, 
  • 해당 [타일 전체 가로, 타일 전체 세로] 값을 리턴한다.

 

 

보완된 풀이

def solution(brown, yellow):
    for i in range(1,int(yellow**0.5)+1) :
        if yellow % i == 0 :
            if ((yellow//i + i) * 2 == brown - 4) :
                return [yellow//i + 2, i+2]

굳이 set 을 이용하지 않고 조건문 두개로 한번에 리턴하는 방법이다!

댓글