자격증 & 문제풀이/프로그래머스 코딩 문제 풀이

[python 파이썬][프로그래머스] 카펫(완전탐색)

YSY^ 2020. 6. 9. 15:10

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

 

코딩테스트 연습 - 카펫

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

programmers.co.kr

문제설명

 

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

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

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

제한사항

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

입출력 예

brown yellow return      
8 1 [3, 3]
10 2 [4, 3]      
24 24 [8, 6]      
8 1 [3,3]      

 


◆ 문제풀이

- 바같쪽에는 갈색줄이 1씩 무조건 있어야함

- N의 약수 리스트에서 끝쪽 부터 양쪽을 곱하면 N이된다는 방식에 착안

ex). 8의 약수 [1,2,4,8] 이며 1,8과 2,4 가 8이된다.

- yellow 의 약수리스트를 먼저 구하고, 세로 가로를 1씩 더해서 곱함

cf) 만약 yellow 와 brown을 더해서 약수를 구한다면 다음과 같은 상황이 발생할 수 있다.

ex) brown, yellow가 각각 24일 경우, 약수가 {12,4}일때

바깥쪽이 brown이 1줄이 안되므로 성립하지 않는다.-

 

- yellow로 먼저 약수리스트를 구하고, brown을 외곽에 1줄씩더한다음, brown의 개수가 맞는지 확인한다.

ex) brown, yellow가 각각 24일 경우

왼쪽은 yellow->(8,3)일 경우이며, brown이 26개이므로 조건에 성립하지 않는다.

오른쪽은 yellow->(6,4)인 경우이며, brown이 24개이므로 조건에 성립한다.

 

◆ 코드풀이

def solution(brown, yellow):
    result = []
    for i in range(1,yellow+1):
        if yellow % i ==0:  #i가 yellow의 약수인 경우
            result.append(i)
    for i in range(len(result)//2+1):
    	#yellow에서 brown을 좌우상하로 1씩 넓혔을 때 주어진 brown개수와 같아야함
        if (result[i]+2) * (result[-i-1]+2) - yellow == brown: 
            return [result[-i-1]+2,result[i]+2]

 

728x90
반응형