알고리즘 스터디

[프로그래머스] 완전탐색 3. 카펫

문제


풀이

카펫의 가장자리만 브라운, 가운데는 노란색이려면 가로, 세로에 어떤 조건이 있을지 생각해봤다.

1. brown + yellow의 소인수일것이다.

입출력 예의 첫번째를 보자면 10 + 2 즉 12는 3과 4의 곱이다.

2. 가로와 세로에서 2씩 뺀 값을 곱하면 yellow 타일 개수일 것이다.

위 두 조건을 만족시키는 값을 찾으면 리턴했다.

def solution(brown, yellow):    
    for height in range(1, brown + yellow + 1):
        if (brown + yellow) % height == 0:
            width = int((brown + yellow) / height)
            if yellow == (height - 2) * (width - 2):
                return [width, height]


다른 사람의 코드

def solution(brown, red):
    for i in range(1, int(red**(1/2))+1):
        if red % i == 0:
            if 2*(i + red//i) == brown-4:
                return [red//i+2, i+2]

int(red**(1/2)+1)은 루트씌워 최대 범위를 줄인 것 같고,,,

두 번째 if문에선 brown-4는 모서리 네 개의 타일을 제거하고 둘레의 길이를 기준으로 계산한 것 같은데

정확히 뭔소린지 모르겠다ㅎㅎ 누가 좀 알려주세요

import math
def solution(brown, yellow):
    w = ((brown+4)/2 + math.sqrt(((brown+4)/2)**2-4*(brown+yellow)))/2
    h = ((brown+4)/2 - math.sqrt(((brown+4)/2)**2-4*(brown+yellow)))/2
    return [w,h]

근의 공식을 이용한 풀이라고 한다. 노트있을때 다시 봐야겠다