https://school.programmers.co.kr/learn/courses/30/lessons/42842
안쪽이 노란색 타일로, 바깥 한 줄을 갈색 타일로 구성된 카펫이 있다. 이 카펫의 갈색, 노란색 타일의 갯수만 알 때 이 카펫의 가로 세로 길이를 구하는 문제
사실 통과라고 하긴 좀 그렇다. 왜냠 몇 번 내보고 소소하게 틀린 것들을 수정해서 냈걸랑,,
def solution(brown, yellow):
tmp = []
mul = []
for i in range(1, yellow//2+1):
if yellow%i==0:
tmp.append(i)
tmp.append(yellow)
for i in range(1,len(tmp)//2+1):
print(tmp[-i])
mul.append([tmp[-i], tmp[i-1]])
if len(tmp)%2:
mul.append([tmp[len(tmp)//2],tmp[len(tmp)//2]])
for i in mul:
if (i[0]+i[1])*2+4 == brown:
return [i[0]+2, i[1]+2]
내 생각은 이거다.
먼저 노란 타일(m*n)의 약수를 구하고, 약수의 쌍들로 (m+n)*2+4
가 brown과 같은지 확인.
같다면, m+2, n+2가 가로 세로 길이다! 라는 것임.
왜냐면 그려보고 생각해낸 것임
m*2+n*2+4
가 갈색 타일의 개수일 것사실 다른 풀이는 생각나지 않는다. 근데 (m+n)*2+4
이게 가장 중요한 포인트인 것 같다는 생각은 확실..!
이건 다른 사람 풀이를 보고 생각한 것
i
와 yellow//i
쌍으로 if 확인해보면 되는 것이었음.루트 N
까지만 나눠지는지 확인해보면 됨def solution(brown, yellow):
for i in range(1, int(yellow**(1/2))+1):
if yellow%i==0:
if (i+yellow//i)*2+4 == brown:
return [yellow//i+2, i+2]
yellow//i
로 나눠지는 i
의 짝은 당연히 yellow//i
잖슴... 왜 이 간단한 걸 생각 못했지?
yellow//i
가 당연히 i
보다 크니까 조건을 만족할 때 [yellow//i+2, i+2]
를 반환하면 되는거고,,,def solution(brown, yellow):
mn = brown+yellow
for n in range(1, mn+1):
if mn%n!=0:
continue
m = mn//n
if (m-2)*(n-2)==yellow:
return [m,n]
이게 더 간단한 방식인 것 같다. 어찌됐든 둘 다 약수를 이용해야한다는 점은 동일
사각형이 나오면 일단 넓이를 생각해보자...