/////////
Search
4️⃣

카펫

1. 접근 방식

문제 조건
갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
노란색의 면적과 갈색의 면적이 주어진다.
노란색 가로 = x, 노란색 세로 = y
전체 면적 = (x+2)(y+2)
노란색 = xy
갈색 면적 = 전체면적 - 노란색 면적 = (x*2)+(y*2)+4

2. 기본 코드에 대한 설명

def solution(brown, yellow): answer = [] x = 0 # 가로 y = 0 # 세로 for i in range(1, yellow+1): if yellow % i == 0: #i가 yellow로 곱해지면 x = i y = yellow//i if x * 2 + y * 2 + 4 == brown: answer.append(x+2) answer.append(y+2) return sorted(answer, reverse = True) #내림차순 정렬 return answer
Python
복사

3. 추가적으로 개선한 코드에 대한 설명

4. 사용 라이브러리 정리

5. 기타(문제 풀이에 어려웠던 점, 구현하고자 했는데 실패한 방식)

ex) 이 방식으로 접근했는데 구현이 힘들어서 개선했습니다. 그 방식으로 접근했는데 접근방식이 잘못되었다는 것을 깨닫고 다시 풀었습니다.
가로 x, 세로 y인 직사각형.
노란색의 면적: (x-2) * (y-2)
갈색의 면적: {(xy) -{(x-2)(y-2)} = 2{(x+y)-2}
구해야 하는 값 : 가로 x, 세로y 의 순서쌍
⇒ 카펫의 약수를 곱해야 함.
⇒ 약수의 배열을 구한 후 오름차순 정렬
from itertools import combinations_with_replacement # 약수의 개수 구하기 def solution(brown, yellow): # 10, 2 prime = brown + yellow primearr = [] for i in range(1, prime+1): if (prime % i == 0): primearr.append(i) arr = list(combinations_with_replacement(primearr, 2))# 중복조합으로 2개 뽑기 for i in range(len(arr)): #각 조합의 원소 추출 # print(arr[i]) #왜 튜플로 인쇄되는거지? x = arr[i][0] y = arr[i][1] if x < y: #가로가 세로보다 작으면 해당 리스트 제거 del arr[i] if x * y != prime: #x,y의 곱이 prime이 아니면 제거 del arr[i] if (x-2) * (y-2) != yellow: del arr[i] if (2 * x) + (2 * y) - 4 != brown: del arr[i] if x <= 2 or y <= 2: del arr[i] return arr #IndexError: list index out of range > arr 길이가 바뀌어서 나는 오류같음
Python
복사