[프로그래머스] 카펫 Python

현지·2021년 9월 26일
0

프로그래머스

목록 보기
23/34

문제

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를 빼서 곱한 값이 노란색과 같으면 정답이다.

  1. 두 수를 더해서 중간값부터 2까지 반복문을 이용한다.
    (약수를 구하는 과정, 1부터 하면 거의 모두 검사하기 때문에 오래걸린다.)
  2. if문을 이용해 나누어 떨어지거나 순서가 바뀌기 전까지만 반복한다.
    ([1, 12], [2, 6], [3, 4]에서 멈추기 위함, 계속하면 [4, 3], [6, 2], [12, 1]까지 모두 나오기 때문이다.)
  3. 이렇게 약수를 구했으면 각 수에서 2를 빼 곱한 값이 yellow와 같으면 answer에 추가한다.

solution함수_python

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

다른 풀이도 비슷하거나 아예 수학적으로 접근해서 푼 경우가 많다.

0개의 댓글