본문 바로가기
Problem Solving/SWEA

[SWEA|파이썬] 1954. 달팽이 숫자 (D2)

by 청량리 물냉면 2023. 5. 20.
반응형
문제

https://tinyurl.com/2ejpvj24

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

 

🐍파이썬

💡 접근방식

달팽이 숫자의 규칙은 인덱스의 방향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

 

SWEA 1954. 달팽이숫자 python(파이썬)

N x N 보드 위에서 빙글빙글 돌면서 숫자를 입력해나아가자.2차 배열 리스트 위에서 자유롭게 사고할 수 있는가?요점은 다중 리스트의 좌표 개념을 얼마나 잘 써먹을 수 있는가의 문제우리가 보

velog.io

 

반응형