문제
손해를 보지 않으면서 채굴할 수 있는 가장 많은 금의 개수를 출력하는 문제이다.
풀이
해당 문제에서 마름모의 모양을 결정할 때 중심으로부터 K만큼까지 떨어질 수 있는 것을 정의로 한다.
이 때 마름모의 중앙과 K가 주어졌을 때 임의의 좌표가 마름모 내부에 있는지 확인하는 코드는 다음과 같다.
def getNumOfGold(row, col, k):
return sum([
matrix[i][j]
for i in range(n)
for j in range(n)
if abs(row - i) + abs(col - j) <= k
])
for row in range(n):
for col in range(n):
for k in range(2 * (n - 1) + 1):
numOfGold = getNumOfGold(row, col, k)
따라서 배열을 순회하며 각 위치와 k값에 대해 얻을 수 있는 금의 최대 개수를 알 수 있다.
if numOfGold * m >= getArea(k):
maxGold = max(maxGold, numOfGold)
이 후 금을 얻었을 때 손해인지 계산한 후 기존 maxGold와 비교하면 된다.
이 때 getArea는 마름모의 넓이를 구하는 함수이며 다음과 같다.
def getArea(k):
return k * k + (k + 1) * (k + 1)
코드
n, m = map(int, input().split())
matrix = [list(map(int, input().split())) for _ in range(n)]
def getArea(k):
return k * k + (k + 1) * (k + 1)
def getNumOfGold(row, col, k):
return sum([
matrix[i][j]
for i in range(n)
for j in range(n)
if abs(row - i) + abs(col - j) <= k
])
maxGold = 0
for row in range(n):
for col in range(n):
for k in range(2 * (n - 1) + 1):
numOfGold = getNumOfGold(row, col, k)
if numOfGold * m >= getArea(k):
maxGold = max(maxGold, numOfGold)
print(maxGold)
'알고리즘' 카테고리의 다른 글
[코드트리 파이썬] 강력한 폭발 (0) | 2024.03.04 |
---|---|
[코드트리 파이썬] 1차원 바람 (0) | 2024.03.02 |
[백준 파이썬] 1068 트리 (0) | 2024.02.26 |
[백준 파이썬] 1068 트리 (1) | 2024.02.25 |
[백준 파이썬] 2133 타일 채우기 (0) | 2024.02.22 |