알고리즘
프로그래머스 LV2 카펫. - 완전탐색
monsangter
2023. 3. 23. 07:37
대략 요런문제..
가로세로 길이를 구하면 되는 문제인데, brown과의 규칙이 있다.
brown은 밑윗변의 길이 + 좌우길이 - 겹치는 모퉁이 4곳
즉 brown == 2x + 2y -4 을만족한다.
또하나의 조건식이 있는데, xy는 brown +yellow를 만족한다.
n = brown + yellow
for i in range(1, n):
if n % i == 0 :
ls.append(i)
먼저 brown+yellow 값의 약수를 찾아 x,y후보군을 ls에 모았다.
이후
v = combinations(ls,2)
for i, j in v:
if i * j == n and brown/2 == i + j -2:
answer.append(j)
answer.append(i)
if not answer:
answer.append(n**(1/2))
answer.append(n**(1/2))
콤비네이션을 활용해
약수의 조합 두개를 골라
두개의 조건식 x * y == brown+ yellow, brown == 2i+2j-4를 만족시키는
i,j를 찾아내answer에 append시켜 줬다.
다만 x가 y보다 커야한다는 조건이 있기 때문에 j먼저 append.
다만 정사각형의 경우 약수 콤비네이션이 불가능 하기때문에
이경우에는 리스트가 비어있게 된다.
이때는 제곱수로 가정해 제곱근을 append시켜줬다.
from itertools import combinations
def solution(brown, yellow):
answer = []
ls = []
# 갈색의 개수. 상하 길이, 좌우길이 , 겹치는 곳4곳.
# 노랑 개수 = 상하길이 -2, 좌우길이 -2 곱했을때 값.
# 즉
# 7 = x+y
# brown = 2x + 2y -4 brown/2 = x+y-2
# xy = brown+yellow
# x와 y를 알아내세요. 단 y는 x보다 작음.
# x+y = brown/2 -2
# 두개 더한 값의 약수를 찾아서, 그 약수를 하나씩 검사해보셈. 맞는게 잇는지
n = brown + yellow
for i in range(1, n):
if n % i == 0 :
ls.append(i)
v = combinations(ls,2)
for i, j in v:
if i * j == n and brown/2 == i + j -2:
answer.append(j)
answer.append(i)
if not answer:
answer.append(n**(1/2))
answer.append(n**(1/2))
return answer