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
복사