관리 메뉴

TEAM EDA

[프로그래머스] 카펫 / 파이썬 본문

EDA Study/알고리즘

[프로그래머스] 카펫 / 파이썬

김현우 2020. 4. 9. 00:59

문제 설명

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

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

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

제한사항

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

입출력 예

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

풀이

  • 완전탐색 방법을 사용
    • 단, 효과적으로 완전탐색을 하기 위해서 가능한 후보들을 먼저 추출
    • 후보 : brown + red (사각형의 갯수)를 만드는 가로와 세로의 길이
      • 후보의 경우 x * y으로 이루어지기에 xy의 약수
  • findvalue 함수로 모든 약수를 찾음
  • left에는 중앙값보다 작거나 같은 값을, right에는 중앙값보다 크거나 같은 값을 삽입
    • 12를 예로 left = [1, 2, 3] right = [4, 6, 12]가 있으면 1 * 12, 2 * 6, 3 * 4가 12를 만드는 케이스
    • point를 하나씩 늘리면서, left[point], right[len(left) - 1 - point]로 가능한 지 검정
  • 2*(left[point] + right[len(left) - 1 - point])-4 == brown는 전체 x* y에서 가운데 red만 빼는 값. 여기서 red는 x와 y에서 2씩을 뺀 값임
    • 즉, (x-2) * (y-2) + brown = xy 이고 이를 정리하면 brown = 2x + 2y - 4가 됨
def findvalue(total):
    answer = []
    for i in range(1, total+1):
        if total % i == 0: answer.append(i)
    return answer 

def solution(brown, red):
    total = brown + red
    sol = [0, 0]
    answer = findvalue(total)
    if len(answer) % 2 == 0: left = answer[0:len(answer)//2]; right = answer[len(answer)//2:]
    else: left = answer[0:1 + len(answer)//2]; right = answer[len(answer)//2:]
    for point in range(0, len(left)):
        if 2*(left[point] + right[len(left) - 1 - point])-4 == brown:
            return [right[len(left) - 1 - point], left[point]]
        else:
            continue 
    return answer

출처: 프로그래머스 코딩 테스트 연습,https://programmers.co.kr/learn/challenges