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 이하인 자연수입니다.
- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
✅두 수의 합의 약수를 구해서 그 중 맞는 값을 찾아야 한다.
노란색은 갈색보다 가로, 세로가 각 2만큼 짧기 때문에 구한 약수에서 각 2를 빼서 곱한 값이 노란색과 같으면 정답이다.
- 두 수를 더해서 중간값부터 2까지 반복문을 이용한다.
(약수를 구하는 과정, 1부터 하면 거의 모두 검사하기 때문에 오래걸린다.)- if문을 이용해 나누어 떨어지거나 순서가 바뀌기 전까지만 반복한다.
([1, 12], [2, 6], [3, 4]에서 멈추기 위함, 계속하면 [4, 3], [6, 2], [12, 1]까지 모두 나오기 때문이다.)- 이렇게 약수를 구했으면 각 수에서 2를 빼 곱한 값이 yellow와 같으면 answer에 추가한다.
def solution(brown, yellow): answer = [] num = brown + yellow for i in range(num//2, 1, -1): if num%i == 0 and i <= int(num/i): if (i-2) * (int(num/i)-2) == yellow: answer.append(int(num/i)) answer.append(i) break return answer