https://programmers.co.kr/learn/courses/30/lessons/42842
문제설명
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}일때
- 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]
'자격증 & 문제풀이 > 프로그래머스 코딩 문제 풀이' 카테고리의 다른 글
[python 파이썬][프로그래머스] 탑(스택/큐) (0) | 2020.06.09 |
---|---|
[python 파이썬][프로그래머스] 멀리 뛰기 (0) | 2020.06.09 |
[python 파이썬][프로그래머스] 땅따먹기 (0) | 2020.06.09 |
[python 파이썬][프로그래머스] 숫자의 표현 (0) | 2020.06.08 |
[python 파이썬][프로그래머스] 등굣길(동적계획법) (0) | 2020.05.28 |