본문 바로가기

PS/프로그래머스

[프로그래머스-완전탐색] 카펫_파이썬 ❌⭕

programmers.co.kr/learn/courses/30/lessons/42842

 

코딩테스트 연습 - 카펫

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

programmers.co.kr


def solution(brown, yellow):
    x = yellow
    while True:
        y = yellow / x
        if brown == 2 * (x+y+2) and x >= y:
            return [x+2, y+2]
        x -= 1

x, y 는 yellow의 가로, yellow의 세로다.

x의 초기값은 최댓값인 yellow로 한다.(y가 1일 때 x는 최대가 되는데, 이때 x의 값은 yellow)

while 문에서 확인해야 될 조건은 2개다.

  1. 2 * (x+y+2)가 brown 값이랑 동일한가?
  2. x 가 y값 이상인가? 

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

yellow의 가로를 row, 세로를 col이라고 했을 때, col의 범위는 1이상 yellow의 제곱근 이하가 된다.

해당 범위를 이용해 row를 찾고 col, row가 조건을 만족한다면 정답을 구할 수 있다.

 

조건은 아래와 같다.

brown = (row + 2) * (col + 2) - (row * col)

brown = 2 * (row + col + 2)