본문 바로가기
알고리즘 문제/프로그래머스_Lv2 도장깨기

[프로그래머스] 카펫 (Python)

by 스코필 2024. 5. 16.

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/42842

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

Leo는 중앙에는 노란색으로 칠해져 있고, 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

Leo는 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로로 크기를 순서대로 배열에 담아 return 하도록 함수를 작성

제한 사항

  • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
  • 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

 

풀이

문제에서 테두리 1줄이 갈색으로 칠해져 있기 때문에, 노란색으로 칠해진 사각형은 울퉁불퉁한 사각형이 아닌 직사각형 즉, yellow의 약수로 가로, 세로가 이루어져야 한다.

 

그림에서 파란색으로 칠해진 사각형과, 빨간색으로 칠해진 사각형을 기준으로 brown 수의 공식을 찾아보면,

(a + 2) * 2 + b * 2 = brown  (a >= b) 를 찾을 수 있고,

전체 가로 세로 길이는 a + 2, b + 2 가 된다.

 

✅ Code - 성공

def solution(brown, yellow):    
    
    for i in range(1, int(yellow**(1/2)) + 1):
        if yellow % i == 0:
            width = [i, yellow // i]
            if (width[0] + 2) * 2 + (width[1] * 2) == brown:
                width.sort(reverse = True)
                return [width[0] + 2, width[1] + 2]