본문 바로가기
프로그래머스/Lv.2

[프로그래머스 Lv.2][완전탐색] 카펫 (python)

by 똥먹는낙타 2022. 11. 8.
728x90
반응형

문제 설명

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

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

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

제한사항
  • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
  • 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
입출력 예brownyellowreturn
10 2 [4, 3]
8 1 [3, 3]
24 24 [8, 6]

출처

※ 공지 - 2020년 2월 3일 테스트케이스가 추가되었습니다.
※ 공지 - 2020년 5월 11일 웹접근성을 고려하여 빨간색을 노란색으로 수정하였습니다.

 

✔️ Code

def solution(brown, yellow):
    answer = []
    yellow_x = 0
    yellow_y = 0
    
    for i in range(1, yellow + 1):
        if yellow % i == 0:
            yellow_x = int(yellow//i)
            yellow_y = i
            
            if yellow_x * 2 + yellow_y * 2 + 4 == brown:
                answer.append(yellow_x + 2)
                answer.append(yellow_y + 2)
                break
            
    answer = sorted(answer, reverse = True)
    
    return answer

 

✏️ Comment

(yellow의 가로 길이 * 2 + yellow의 세로 길이 * 2 + 4 = brown 넓이) 이 수식이 포인트이다. 해당 수식은 그림 그려보면서 고민한 끝에 생각해냈는데, 바보같이 yellow가 짝수일 경우 홀수일 경우를 나누고 앉아있었다.. 그리고 막 .. yellow를 만들 수 있는 약수들을 계산해서 어떻게 해야하지? 이러면서 삽질 엄청 했는데.. 다시 보니까 그냥 모든 경우에 저 수식이 들어맞았다. 

yellow를 만들 수 있는 경우의 수를 어떻게 찾아야하나 고민하다가 구글링해서 참고했다. yellow의 약수이면서 (yellow의 가로 길이 * 2 + yellow의 세로 길이 * 2 + 4 = brown 넓이) 이 수식을 만족하는 수들을 찾는다.

카펫의 가로 길이는 yellow의 가로 길이+2, 카펫의 세로 길이는 yellow의 세로 길이+2 이므로 각각 2를 더해서 answer 배열에 넣어주고 break를 통해 for문을 멈춰준다. 그리고 가로 길이 > 세로 길이여야 하므로 (참고로 return해야 하는 answer 배열 원소 순서는 [가로의 길이, 세로의 길이]) sorted(answer, reverse=True)를 통해서 내림차순 정렬을 해준다.

728x90
반응형

댓글