Algorithm/Simulation

[백준] 1913 : 달팽이 (파이썬)

_은선_ 2024. 8. 24. 03:41
728x90
SMALL

구현 문제

https://www.acmicpc.net/problem/1913


접근 방식

  • 중심 좌표로부터 시작한다.
  • 특정 좌표로부터 위, 오, 아, 왼 순으로 이동한다.
  • 이때, 위쪽과 아래쪽 방향으로 이동할 때, 이동해야할 길이(i)를 전보다 1 증가시켜준다. 
if j == 0 or j == 2:
    i += 1
  • 이동해야 할 길이(i)만큼 이중 for문을 돈다.
    • 현재 방향(j)으로 좌표를 한 칸 이동한 후, 해당 그래프의 좌표에 cnt를 기록해준다.
for _ in range(i):
    if cnt == k:
        ans.append(y + 1)
        ans.append(x + 1)

    if cnt >= n * n: return # while문 탈출 조건 지정

    cnt += 1
    y += dy[j]
    x += dx[j]

    graph[y][x] = cnt

 


💡 풀이코드 (성공)

import sys 
n = int(sys.stdin.readline())
k = int(sys.stdin.readline())

dy = [-1, 0, 1, 0] # 위, 오, 아, 좌
dx = [0, 1, 0, -1] # 위, 오, 아, 좌

graph = [[0] * n for _ in range(n)]
ans = []

def sol():
    cnt = 1
    y = n // 2 
    x = n // 2 
    i = 0
    graph[y][x] = cnt

    while True:
        for j in range(4):
            if j == 0 or j == 2:
                i += 1

            for _ in range(i):
                if cnt == k:
                    ans.append(y + 1)
                    ans.append(x + 1)

                if cnt >= n * n: return # while문 탈출 조건 지정

                cnt += 1
                y += dy[j]
                x += dx[j]

                graph[y][x] = cnt 

sol()
for i in graph:
    print(*i)
print(*ans)

 

달팽이 수열의 규칙을 찾고, 구현하는 문제이다.

 

728x90
LIST