문제링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&problemLevel=3&problemLevel=4&contestProbId=AV5PobmqAPoDFAUq&categoryId=AV5PobmqAPoDFAUq&categoryType=CODE&problemTitle=&orderBy=RECOMMEND_COUNT&selectCodeLang=ALL&select-1=4&pageSize=10&pageIndex=1

 

SW Expert Academy

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

swexpertacademy.com

문제설명

달팽이는 1부터 N*N까지의 숫자가 시계방향으로 이루어져 있다.

다음과 같이 정수 N을 입력 받아 N크기의 달팽이를 출력하시오.


[예제]

N이 3일 경우,
 


N이 4일 경우,
 

[제약사항]

달팽이의 크기 N은 1 이상 10 이하의 정수이다. (1 ≤ N ≤ 10)


[입력]

가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.

각 테스트 케이스에는 N이 주어진다.


문제풀이

이차원 배열에서의 주어진 조건(여기서는 시계방향)대로 인덱스에 접근하기 위한 구현 문제다.

방향전환, 범위체크 등이 가장 핵심이었으며

이전에 많이 비슷한 문제를 많이 풀어봤었지만 응용하려면 또 생각이 더 필요한 문제였던 것 같다.

코드
T = int(input())

for tc in range(1, T+1):
    N = int(input())
    arr = [[0 for _ in range(N)] for _ in range(N)]

    dx = [0, 1, 0, -1] # (동, 남, 서, 북)
    dy = [1, 0, -1, 0]
    dir = 0
    r, c = 0, 0

    for num in range(1, N*N+1):
        # 숫자 삽입
        arr[r][c] = num
        # 이동
        r += dx[dir]
        c += dy[dir]

        # 해당 지역이 범위를 벗어났거나 이미 값이 있다면
        if r < 0 or r >= N or c < 0 or c >= N or arr[r][c]:
            # 이전상태로 다시이동 
            r -= dx[dir]
            c -= dy[dir]

            # 방향 바꾸기(동->남, 남->서, 서->북, 북 >동)
            dir = (dir + 1) % 4

            # 이동
            r += dx[dir]
            c += dy[dir]

    print('#' + str(tc))
    for row in arr:
        print(*row)

+ Recent posts