본문 바로가기
🔅코딩테스트 공부🔅/❗백준

[백준] 1913번 달팽이(python)

by 윤무무 2023. 4. 18.

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

 

1913번: 달팽이

N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서

www.acmicpc.net

 

1. 난이도 실버3

 

2. 내가 작성한 풀이

숫자가 커지는 방향으로 구현하면 방향전환이 너무 많이 일어날 것 같아 큰 수 부터 작은 수를 채우는 방향으로 구현했다.

 

1. 배열을 n*n으로 선언한다.

 

2. 각 layer 마다 왼쪽 꼭짓점은 (i,i)값으로 채워주고, 아래, 오른쪽, 위, 왼쪽 순서대로 이동한다.

+ 이미 왼쪽 꼭짓점이 채워져있기 때문에 왼쪽으로 이동할 경우 1번 덜 움직인다.

 

3. 2번을 layer 갯수만큼 반복한다.

 

4. 가운데를 1로 채운다.

 

n = int(input())
check = int(input())
maps = [[0] * n for _ in range(n)]

def repeat(move,now):
    global now_num
    maps[now[0]][now[1]] = now_num
    dx = [1,0,-1,0]
    dy = [0,1,0,-1]
    for i in range(4):
        for j in range(move):
            if i == 3 and j == move-1: # ← 방향은 다른 방향보다 1번 덜 움직임
                continue
            now = (now[0] + dx[i], now[1] + dy[i]) #현재 위치 갱신
            now_num -= 1 
            maps[now[0]][now[1]] = now_num #배열에 숫자 채워주기
      
now_num = n*n
cnt = n//2 #layer수
move = n-1

for i in range(cnt):
    now = (i,i) #현재 위치 
    repeat(move,now) 
    move -= 2 #layer마다 움직이는 거리가 2씩 줄어듦
    now_num -= 1

maps[cnt][cnt] = 1 #가운데 채우기

for i in range(n): #전체 maps 출력
    for j in range(n):
        print(maps[i][j], end=" ")
        if maps[i][j] == check: #찾고자 하는 위치 확인
            check = (i+1, j+1)
    print()

for i in range(2): #check 출력
    print(check[i],end=" ")

 

 

3. 메모

 

구글링 해보니까 작은수 => 큰수도 할 만 한 거 같다.

 

담에는 이 방식으로 해봐야지

 

댓글