여니의 취준 준비/코딩테스트 (Python)

[Python] n1913 | 달팽이

여니's 2021. 4. 29. 11:15

 

 

[2022.02.22 푼 코드]

n = int(input())
input_num = int(input())
dic = {}
array=[[0 for _ in range(n)] for _ in range(n)]
temp = 1  # 1~N까지의 정수 (표에 들어갈)
x, y = n // 2, n // 2
dic[temp] = (x, y)
array[x][y]=1
# 상,우,하,좌
dx = [-1,0,1,0]
dy = [0, 1, 0, -1]
cnt = 1

for i in range(1, n + 1):
    if i==n:
        for j in range(i-1):
            # 상
            temp+=1
            x+=dx[0]
            y+=dy[0]
            dic[temp]=(x,y)
            array[x][y]=temp
        break
    if i % 2 != 0:  # 상, 우
        for j in range(i):
            # 상
            temp += 1
            x += dx[0]
            y += dy[0]
            dic[temp] = (x, y)
            array[x][y]=temp

        for j in range(i):
            # 우
            temp+=1
            x+=dx[1]
            y+=dy[1]
            dic[temp]=(x,y)
            array[x][y]=temp

    else:  # 하,좌
        for j in range(i):
            # 하
            temp+=1
            x+=dx[2]
            y+=dy[2]
            dic[temp]=(x,y)
            array[x][y]=temp

        for j in range(i):
            # 좌
            temp+=1
            x+=dx[3]
            y+=dy[3]
            dic[temp]=(x,y)
            array[x][y]=temp

    cnt += 1

for i in range(n):
    print(*array[i])
print(dic[input_num][0]+1,dic[input_num][1]+1)
# https://www.acmicpc.net/problem/1913
n=int(input())
find_num=int(input())
array=[[None]*n for i in range(n)]

# 상,하,좌,우
dx=[-1,1,0,0]
dy=[0,0,-1,1]

array[n//2][n//2]=1 # 1 위치 잡아주기
x=n//2 # 현재 x좌표
y=n//2 # 현재 y좌표

 

>> 입력 받는 과정 

먼저 1의 값은 위치를 잡아주고 시작했다.

 

 

for i in range(1,n+1):
    if i%2!=0: #홀수일 경우
        if i==n:
            for _ in range(i-1):
                nx=x+dx[0]
                ny=y+dy[0]
                array[nx][ny]=array[x][y]+1
                x=nx
                y=ny
        else:
            for _ in range(i):
                nx=x+dx[0]
                ny=y+dy[0]
                array[nx][ny]=array[x][y]+1
                x=nx
                y=ny

            for _ in range(i):
                nx = nx + dx[3]
                ny = ny + dy[3]
                array[nx][ny] = array[x][y] + 1
                x=nx
                y=ny

    else: #짝수일경우
        for _ in range(i):
            nx=x+dx[1]
            ny=y+dy[1]
            array[nx][ny]=array[x][y]+1
            x=nx
            y=ny

        for _ in range(i):
            nx=nx+dx[2]
            ny=ny+dy[2]
            array[nx][ny]=array[x][y]+1
            x=nx
            y=ny

        x=nx
        y=ny

>>  i의 값이 n값 (격자크기)와 같아질때까지 for문을 반복한다.

n=3일경우, 이동하는 과정은 총 2번!

n=5일 경우에는 4번이니까

for문은 n-1번 돌아가도록 설정하기

 

n이 홀수일 경우에는 

움직이는 순서가 상 -> 우,

 

n이 짝수일 경우에는

움직이는 순서가 하->좌

 

따라서 i의 값이 홀수면 상->우로 움직이고

i의 값이 짝수면 하->좌로 움직인다.

for i in range(n):
    for j in range(n):
        print(array[i][j],end=' ')
    print()

for i in range(n):
    for j in range(n):
        if array[i][j]==find_num:
            print(i+1,j+1)
            break

>>