반응형
문제설명
다음과 같이 n x n 크기의 격자에 1부터 n x n까지의 수가 하나씩 있습니다.
이때 수가 다음과 같은 순서로 배치되어있다면 이것을 n-소용돌이 수라고 부릅니다.
소용돌이 수에서 1행 1열부터 n 행 n 열까지 대각선상에 존재하는 수들의 합을 구해야 합니다.
위의 예에서 대각선상에 존재하는 수의 합은 15입니다.
격자의 크기 n이 주어질 때 n-소용돌이 수의 대각선상에 존재하는 수들의 합을 return 하도록 solution 함수를 완성해주세요.
매개변수 설명
격자의 크기 n이 solution 함수의 매개변수로 주어집니다.
* n은 1 이상 100 이하의 자연수입니다.
return 값 설명
n-소용돌이 수의 대각선상에 존재하는 수들의 합을 return 해주세요.
예시
| n | return |
|--- |-------- |
| 3 | 15 |
| 2 | 4 |
예시 설명
예시 #1
문제의 예와 같습니다.
예시 #2
1과 3을 더하여 4가 됩니다.
문제 코드
def solution(n):
# Write code here.
answer = 0
return answer
풀이 1
def solution(n):
answer = 1
num = 1
# 첫번째 소용돌이 수는 1
# 두번째, 세번째 소용돌이 수는 1+2(n-1), 1+4(n-1)
# 네번째, 다섯번째 소용돌이 수는 1+4(n-1)+2(n-3), 1+4(n-1)+4(n-3)
while n > 2:
num += 2 * (n-1)
answer += num
num += 2 * (n-1)
answer += num
n -= 2
if n%2 == 0:
num += 2 * (n-1)
answer += num
return answer
풀이 2
# x, y 좌표가 0 이상 n 미만인지 구하기
def in_range(i, j, n):
return 0 <= i and i < n and 0 <= j and j < n
def solution(n):
pane = [[0 for j in range(n)] for i in range(n)]
dy = [0, 1, 0, -1]
dx = [1, 0, -1, 0]
ci, cj = 0, 0
num = 1
# n*n 격자에 소용돌이 수 구하기
while in_range(ci, cj, n) and pane[ci][cj] == 0:
for k in range(4):
if not in_range(ci, cj, n) or pane[ci][cj] != 0:
break
while True:
pane[ci][cj] = num
num += 1
ni = ci + dy[k]
nj = cj + dx[k]
if not in_range(ni, nj, n) or pane[ni][nj] != 0:
ci += dy[(k + 1) % 4]
cj += dx[(k + 1) % 4]
break
ci = ni
cj = nj
ans = 0
# 소용돌이 수 대각선 합 구하기
for i in range(n):
ans += pane[i][i]
return ans
댓글