Python 문제 15
#문제5
다음과 같이 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가 됩니다.
와 어떻게 해야 할지 감이 안잡힌다.
규칙을 알아내야하나? 2차배열형태로 만들어야하나?
답을 봐야겠다 ㅠ
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
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
와 존나 어렵다 이해가 힘드네..
2차 배열로 하는건 맞는듯
이해하는데 한시간 걸림.. 와 오바다
최근에 공책으로 옮겨서 푼적이 없었는데 오랜만에 공책이용
하면서도 어려웠다.
잘안보이는데 검은색이 코드 쓴거 파란색이 필기? 한거임
이번꺼는 하나하나씩 분석해보자
pane = [[0 for j in range(n)] for i in range(n)]
n의 값만큼 n*n의 배열 만들어 줌
dy = [0, 1, 0, -1]
dx = [1, 0, -1, 0]
for k in range(4):
나는 이걸 왜 쓰는지 몰랐다.
range가 4인 이유는 dy, dx가 길이가 4여서 그런거고
dy, dx 배열에 저렇게 넣은것은 n-소용돌이 이걸 표현하기 위해서 음.. 돌아가는 방향을 바꿔줄라고? 이거임
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
ci, cj 는 쉽게 숫자를 넣을 배열 위치를 알려주는 변수들
ni, nj는 while문을 break할 비교할 변수들
k는 0 1 2 3 까지 1씩 증가하는데 dx, dy 뒤에 인덱스로 붙혀 있는데 이게 표현하는게 방향을 바꿔주는거임
처음엔 x+1 다음엔 y+1, x-1, y-1 이런식으로 된다. 이런식으로 가면은 소용돌이 처럼 될수 있다.
그럼 언제까지 x+1을 할꺼냐 in_range함수 false가 될때까지(일단 이것만보자)
in_range함수는 ci, cj 가 0보다 크거나 같고 n보다는 작아야한다.
이게 풀어서 설명하면 n*n의 크기인데 계속 x+1이 아니라 n보다 커지면 방향을 바꾸겠다는 거다
그리고 pane[ni][nj] != 0은 계속 돌다보면 안쪽으로 돌아야 할때가 생기는데 그걸 안쪽으로 돌게 해주게 만드는식이다.
ans = 0
for i in range(n):
ans += pane[i][i]
return ans
만약 다 돌았다면 pane[i][i]으로 대각선만 합 구해서 리턴 끝!
너무 힘들었네 ㅠㅠ
출처 : ybmit.com/