[프로그래머스 알고리즘 스터디] 3주차 - 카펫

YUZAMIN
Hello, World! I'm YUZAMIN, a diligently endeavoring frontend developer 🐤💦
[프로그래머스 알고리즘 스터디] 3주차 - 카펫

문제 설명 📑

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 빨간색으로 칠해져 있고 가장 끝쪽의 모서리 한 줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 빨간색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다. Leo가 본 카펫에서 갈색 격자의 수 brown, 빨간색 격자의 수 red가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항 🚫

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

문제 풀이 👩🏻‍💻

풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 카펫
from itertools import combinations


def solution(brown, red):
    divisors = []

    # 빨간 블럭 개수의 약수들을 구한 뒤,
    # 빨간 블럭 약수들 중 두 개를 선택하여 두 수를 곱했을 때
    # 그 값이 빨간 블럭의 개수에 해당하면
    # 그 두 개의 약수의 합에 2를 곱한 뒤 4(위아래 네 개의 모서리 블럭)을 더해 봄
    # 그 값이 갈색 블럭의 개수에 해당하는지 확인한 뒤 해당하면
    # 두 약수의 곱이 빨간 블럭의 개수이며
    # 그 두 개의 약수의 합에 2를 곱한 뒤 4(위아래 네 개의 모서리 블럭)을 더한 값이
    # 갈색 블럭의 개수임

    # 빨간 블럭 개수의 약수를 구하여 divisors 리스트에 추가
    for i in range(1, red + 1):
        if red % i == 0:
            divisors.append(i)

    # 약수들을 2개씩 쌍으로 곱해봐야 하므로
    # 만약 약수들의 개수가 홀수이면 가운데값에 해당하는 약수를
    # 약수 리스트에 한번 더 추가
    if len(divisors) % 2 != 0:
        divisors.append(divisors[len(divisors) // 2])

    # 약수 리스트에서 2개를 뽑은 모든 조합 리스트 생성
    divisors_combinations = list(combinations(divisors, 2))

    # 조합 리스트에서 조합 순회
    for combination in divisors_combinations:
        # 두 약수를 곱한 값이 빨간 블럭의 개수에 해당하며 두 약수를 더한 뒤 2를 곱하고 4를 더한 값이 갈색 블럭의 개수에 해당하면
        # 해당 약수 값들을 사용하여 카펫 가로 세로의 값을 return
        if combination[0] * combination[1] == red and (combination[0] + combination[1]) * 2 + 4 == brown:
            return [max([combination[0], combination[1]]) + 2, min([combination[0], combination[1]]) + 2]

문제 출처