프로그래머스
[프로그래머스] 카펫 파이썬
띵지니어
2023. 9. 20. 13:54
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/42842
문제 보기
내 코드
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]
조건에 만족하는 약수를 넣으면 나머지 테스트케이스도 맞게 된다.
반응형