자료구조 및 알고리즘/백준

[python] 1913. 달팽이

viamemine 2024. 5. 29. 18:33
728x90
반응형

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

 


 

해당 문제를 풀이할 때 아래 링크의 유투브 강의를 참고했습니다.

큰 도움이 되므로 시청을 왕 - 추천합니다 ! 

 

https://www.youtube.com/watch?v=rw2gQg9x_EA

 

 


문제 풀이 방법은 두 가지 방식이 있습니다.

1. 1부터 채우기

2. 49(n*n)부터 채우기

 

저는 2번 방법으로 문제를 해결했습니다.

 

 

풀이

풀이 방법을 안다면 코드 구현은 그렇게 어렵지 않습니다.  

 

 

 

하지만 자꾸만

시작 지점(arr[0][0])에서 오류가 났는데요.

 

이는 while문 안의 ni  = i + di[dr], nj = j + dj[dr]에서

arr[0][0]을 채우기도 전에 좌표를 dr만큼 이동시키기 때문입니다. 

 

따라서 저는 arr[0][0]은 n*n으로 채워놓고, 

cnt을 n*n-1~1(48부터 1까지)로 설정하여 arr[i][j]를 채우는 방향으로 문제를 풀었습니다.

 

 

n = int(input())
num = int(input())

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

# 상하좌우 순서 (x, y랑 헷갈리면 안됨 !)
di = [1, 0, -1, 0]
dj = [0, 1, 0, -1]

i, j, dr = 0, 0, 0 # 하우상좌
cnt = n*n-1

while cnt != 0:
    # 다음 위치 = 현재 위치 + 움직일 방향
    if i ==0 and j==0:
        arr[i][j] = n*n

    ni, nj = i + di[dr], j + dj[dr] # 시작부터 한 칸 가고 있음

    # 범위내에 있고, 방문한 적이 없는 경우
    if 0<=ni<n and 0<=nj<n and arr[ni][nj]==0:
        i, j = ni, nj
        arr[i][j] = cnt
        cnt -= 1

    else: # 범위 밖에 있을 때 -> 방향을 바꿔줌
        dr = (dr+1)%4

result=[]
for i in range(n):
    for j in range(n):
        print(arr[i][j], end=' ')
        if j == n-1:
            print()

        if arr[i][j] == num:
            result = [i+1, j+1]

print(*result)

 

 

 

728x90