[SWEA-d2]1954. 달팽이 숫자 - python

iamjinseo·2022년 11월 15일
0

문제풀이-Python

목록 보기
133/134
post-thumbnail

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

문제 설명

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

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

[예제]

N이 3일 경우,

N이 4일 경우,

[제약사항]

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

[입력]

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

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

[출력]

각 줄은 '#t'로 시작하고, 다음 줄부터 빈칸을 사이에 두고 달팽이 숫자를 출력한다.

(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)


풀이

# dfs
for t in range(int(input())):
    n = int(input())
    board = [[0 for _ in range(n)] for _ in range(n)]
    dyx = [(0, 1), (1, 0), (-1, 0), (0, -1)]  #오른쪽 아래 왼쪽 위
    x, y, v = 0, 0, 1
    board[x][y] = v
    next = 0 #방향
    while True:  #한쪽 방향으로만 전진
        if v == n**2: break  #값이 n제곱이라는 것은 값을 모두 채웠다는 것
        ny = y + dyx[next][0]
        nx = x + dyx[next][1]
        try:
            if board[ny][nx] == 0:  #다음 길이 미방문상태
                x = nx
                y = ny
                v += 1
                board[ny][nx] = v  #방문처리
            else:
                raise IndexError  #이미 값이 들어간 곳을 만나면 인덱스 에러
        except IndexError:  #막다른 길 발생시에 다른방향으로 바꾸기
            next = (next + 1) % 4

    print(f"#{t+1}")
    for row in board:
        print(*row)

이 문제는 보자마자 음..DFS로구나..하는 생각이 들었다.
하지만 DFS는 쓰지 않았다(??)...스택도 백트래킹도 없다...

설명하자면 달팽이는 오른쪽->아래->왼쪽->위한 사이클로 두고 움직인다.
한쪽 방향으로 가다가 막히면, 다음방향으로 가다가 또 막히면 다음방향으로 가다가.....
위로 가다 막히면 또 새로운 사이클을 시작하는 것이다.

이걸 구현해내면 된다

결과


다른 파이썬 유저들에 비해, 메모리가 적고 실행시간도 빠르다

하지만 코드가 길지롱

후기

리스트 탐색하는 감을 슬슬 익혀가고 있는 것 같다. 몇달 전까지만 해도 이런 문제에 손도 못 댔는데ㅎㅎ

profile
일단 뭐라도 해보는 중

0개의 댓글