반응형
문제
🐍파이썬
💡 접근방식
달팽이 숫자의 규칙은 인덱스의 방향이 j+1, i+1, j-1, i-1 순서대로 변한다는 것이다.
인덱스는 가장 처음에는 n번 바뀌고 이후부터 n-1, n-1, n-2, n-2, ..., 1번 변한다.
예를 들어 위 사진의 배열은 4x4이므로 n = 4이다. 오른쪽으로 인덱스가 이동하는 j+1은 4번, 아래쪽으로 인덱스가 이동하는 i+1은 3번, 왼쪽으로 인덱스가 이동하는 j-1은 3번, 위쪽으로 인덱스가 이동하는 i-1은 2번, 다시 j+1은 2번, i+1은 1번, j-1은 1번 인덱스값이 바뀐다.
이를 구현하기 위해 인덱스가 변하는 횟수를 변수 cnt에 저장했고 2회마다 -1씩 줄어들게 했다. cnt값만큼 for문을 돌며 해당하는 arr배열의 인덱스에 값을 저장하였다.
T = int(input())
for test_case in range(1, T + 1):
n = int(input())
arr = [[0 for _ in range(n)] for _ in range(n)]
cnt = n
num = 1
i, j = 0, 0
while cnt:
for _ in range(cnt):
arr[i][j] = num
j += 1
num += 1
j -= 1 #cnt값이 n인 경우 j값은 n-1번 늘어나야 하므로 한번은 빼준다. 이 부분 처리해주지 않으면 인덱스범위를 벗어나 에러 발생
i += 1 #현재 i값 하나는 처리했으므로 다음 i값부터 처리할 수 있게 i+1진행
cnt -= 1 #cnt값을 줄여 n-1회 돌도록 처리
if cnt == 0: break #cnt값이 0이 된다면 더이상 처리할 게 없으므로 while문 벗어남
for _ in range(cnt):
arr[i][j] = num
i += 1
num += 1
j -= 1
i -= 1
for _ in range(cnt):
arr[i][j] = num
j -= 1
num += 1
cnt -= 1
if cnt == 0: break
i -= 1
j += 1
for _ in range(cnt):
arr[i][j] = num
i -= 1
num += 1
j += 1
i += 1
print("#{}".format(test_case))
for i in range(n):
for j in range(n):
print(arr[i][j], end=" ")
print()
다른 풀이 방법
T = int(input())
for case_num in range(1,T+1):
N = int(input())
board = [[0]*N for _ in range(N)] # 숫자가 적힐 보드 제작
stock = 0 # 사이클 마다 축적된 sum
for i in range(N//2): # 짝수는 딱 떨어지고 홀수는 1번 부족하게
turn = ((N-1)-2*i) # turn = 사이클 변수
for j in range(turn): # 매번 적기 힘들어서 넣음
board[i][i+j] = stock + j+1 # 시작점(1) [그림 설명]
board[i+j][(N-1)-i] = stock + (turn)+(j+1) # 시작점(2) [그림 설명]
board[(N-1)-i][(N-1)-(i+j)] = stock + 2*(turn)+(j+1)# 시작점(3) [그림 설명]
board[(N-1)-(i+j)][i] = stock + 3*(turn)+(j+1) # 시작점(4) [그림 설명]
stock += 4*(turn) # 사이클의 마지막 값을 다음 시작점에 더함
if N % 2 == 1: # 홀수 N의 가운데 빵꾸에
board[N//2][N//2] = N**2 # NxN 보드에 들어갈 마지막 값, N**2 기입
print(f'#{case_num}')
for lines in range(len(board)): # 각 라인을 출력
print(*board[lines]) # 리스트 양 옆 [ ]를 언팩하기 위해 * 사용
풀이 출처: https://tinyurl.com/2e7ge9ac
반응형
'Problem Solving > SWEA' 카테고리의 다른 글
[SWEA|파이썬] 9280. 진용이네 주차타워 (D3) (1) | 2023.05.21 |
---|---|
[SWEA|파이썬] 3499. 퍼펙트 셔플 (D3) (0) | 2023.05.20 |
[SWEA|파이썬] 5356. 의석이의 세로로 말해요 (D3) (0) | 2023.05.20 |
[SWEA|파이썬] 1230. [S/W 문제해결 기본] 8일차 - 암호문3 (D3) (0) | 2023.05.19 |
[SWEA|파이썬] 1873. 상호의 배틀필드 (D3) (1) | 2023.05.19 |
[SWEA|파이썬] 13428. 숫자 조작 (D3) (0) | 2023.05.18 |