프로그래머스

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

띵지니어 2023. 9. 20. 13:54

https://school.programmers.co.kr/learn/courses/30/lessons/42842

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 보기

 

내 코드

def solution(brown, yellow):
    
    d = []
    n = brown + yellow # n : 전체 블럭의 수
    for i in range(1, int(n**(1/2)) + 1): # 약수 모음
        if (n % i == 0):
            d.append(i) 
            if ( (i**2) != n) : 
                d.append(n // i)
    d.sort()
    
    for i in range(len(d)-1, 0, -1):
        x = d[i]
        y = n / x
        if (x-2)*(y-2) == yellow:
            return [x, y]

Review

 

문제를 풀다보면 가로길이 * 세로길이 = brown + yellow 정도는 충분히 유추 할 수 있다.

그래서 따로 약수만 구해서 약수의 가운데 수 이구나라고 생각했지만 테스트 케이스 3개가 실패하였다.

이유는 brown = 18, yellow = 6 일 때 [8, 3] 이 정답이기 때문이다 (위의 로직으로만 실행하면 [6, 4] 가 담김)

 

 

⭐️⭐️⭐️⭐️
여기서 놓친 게 있는데


여기서 문제의 조건은 항상 노란색 카펫을 갈색 카펫이 둘러싸는 형태이니, (total 가로 길이-2) * (total 세로 길이-2) = yellow

를 만족시켜야 한다.

 

따라서 약수를 구해 오름차순으로 나타낸 후, 큰 수부터 비교해서

    for i in range(len(d)-1, 0, -1):
        x = d[i]
        y = n / x
        if (x-2)*(y-2) == yellow:
            return [x, y]

 

조건에 만족하는 약수를 넣으면 나머지 테스트케이스도 맞게 된다.