728x90
※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.
728x90
내 생각
2차 배열이 아닌 1차 배열로 풀었다.
0 | 1 | 2 | 3 |
4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 |
위와 같은 인덱스를 가진 1차배열을 보기 쉽게 4줄로 끊어서 배치했다고 생각한다.
저 배열에 달팽이 숫자로 수를 채우려면 다음과 같은 순서로 배열에 접근 해야 한다.
0 → 1 → 2 → 3 → 7 → 11 → 15 → 14 → 13 → 12 → 8 → 4 → 5 → 6 → 10 → 9
인덱스의 규칙을 잘 살펴보면,
+1 x3 (0 → 1 → 2 →3)
+4 x3 (3 → 7 → 11 → 15)
-1 x3 (15 → 14 → 13 →12)
-4 x2 (12 → 8 → 4)
+1 x2 (4 → 5 → 6)
+4 x1 (6 → 10)
-1 x1 (10 → 9)
와 같은 규칙을 보인다.
N=5인 경우,
+1 x4
+5 x4
-1 x4
-5 x3
+1 x3
+5 x2
-1 x2
-5 x1
+1 x1
와 같은 규칙을 보인다.
이 규칙을 사용해서 문제를 풀었다.
T = int(input())
for test_case in range(1, T + 1):
N = int(input())
#NxN의 1차 배열 생성
arr = [0] * N * N
num = 0
#처음 N개는 처음부터 순서대로 배열에 넣어준다.
for i in range(N):
num += 1
arr[i] = num
idx = N - 1
for i in range(N - 1, 0, -2):
for j in range(i):
idx += N
num += 1
arr[idx] += num
for j in range(i):
idx -= 1
num += 1
arr[idx] += num
for j in range(i - 1):
idx -= N
num += 1
arr[idx] += num
for j in range(i - 1):
idx += 1
num += 1
arr[idx] += num
print("#{}".format(test_case))
for i in range(0, N*N, N):
for j in range(N):
print(arr[i + j], end=" ")
print()
728x90
'Problem Solving > SWEA' 카테고리의 다른 글
[SW Expert Academy, SWEA 1946] 간단한 압축 풀기 (python) (0) | 2022.09.09 |
---|---|
[SW Expert Academy, SWEA 1948] 날짜 계산기 (python) (1) | 2022.09.07 |
[SW Expert Academy, SWEA 1959] 두 개의 숫자열 (python) (0) | 2022.09.07 |
[SW Expert Academy, SWEA 1961] 숫자 배열 회전 (python) (0) | 2022.09.07 |
[SW Expert Academy, SWEA 1966] 숫자를 정렬하자 (python) (0) | 2022.09.07 |