Tiny Finger Point Hand With Heart
본문 바로가기
알고리즘문제풀이/SWEA

[SWEA / PYTHON] 1954. 달팽이 숫자

by yoondii 2023. 1. 4.
728x90
반응형

[D2] 달팽이 숫자 - 1954

문제 링크

성능 요약

메모리: 43,252 KB, 시간: 95 ms, 코드길이: 792 Bytes

출처: SW Expert Academy, https://swexpertacademy.com/main/code/problem/problemList.do

 

문제를 보고 어떻게 풀어야하겠다는 알았지만 코드로 작성하려니 턱 막혔다.. 너무풀고싶었어

그려보면서 이해하는 수 밖에..

 

방향은 우 - 하 - 좌 - 상 인것을 알 수가 있다.

한칸씩 움직일 때 마다 cnt에 1을 더하면서 방향을 옮겨주었다.

 

한방향으로 갈 수 있는 조건은 범위 이내거나 arr의 값이 0이여야한다. 

아니라면 방향바꾸기

즉, 방향을 바꾸기 위한 조건을 추가해줬다.

 

> 최종코드

t = int(input())
# 우 하 좌 상
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]

for tc in range(1, t + 1):
    n = int(input())
    arr = [[0] * n for _ in range(n)] # 배열만들기
    x, y, cnt, dr = 0, 0, 1, 0  # 초기값 // cnt가 1인 이유는 1부터 시작해서
    arr[x][y] = cnt
    cnt += 1  # 숫자가 증가하니까 cnt도 증가

    while cnt <= n * n:
        nx, ny = x + dx[dr], y + dy[dr]  # 다음좌표는 현재좌표+방향

        if 0 <= nx < n and 0 <= ny < n and arr[nx][ny] == 0:
            # 조건에 맞으면 다음좌표로 넘어가기
            x, y = nx, ny
            arr[x][y] = cnt
            cnt += 1
        else:
            dr = (dr + 1) % 4  # 방향도 바꾸는데 인덱스는 3까지여서 4부터는 0으로 되돌아가게 하기
    print(f"#{tc}")
    for i in arr:
        print(*i)

 

 

처음에 풀때는 조건을 계속 다음좌표가 아닌 현재 좌표로 줘서 아예 프린트가 안됐었다..껄껄...밥우

그리고 인덱스를 처음으로 돌아와 계속 돌게하는 방법을 너무 어렵게 생각하고 있어서 쉬운 방법을 떠올리지 못했다.

항상 문제풀때 어렵게 생각해서 진짜 어려워지는 느낌,,ㅎㅎ

풀어서 속시원~ 근데 이게 왜 D2인거죠? 어려워요ㅠㅠ

728x90
반응형

댓글