Engineering Note

[BOJ:1913] 달팽이 본문

Problem Solving/BOJ

[BOJ:1913] 달팽이

Software Engineer Kim 2022. 5. 10. 18:13

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

Note

숫자 입력 방식에서 규칙이 없을지 직접해보면서 방향 전환에서 규칙을 발견했다.

N이 3일 경우 1:(상, 우) 2:(하,하 좌,좌, 상,상)

N이 5일 경우 1:(상, 우) 2:(하,하, 좌,좌) 3:(상,상,상, 우,우,우) 4:(하,하,하,하, 좌,좌,좌,좌, 상,상,상,상)

N이 7일 경우 1:(상. 우) 2:(하,하, 좌,좌) 3:(상,상,상, 우,우,우) 4(하,하,하,하, 좌,좌,좌,좌) 5:(상,상,상,상,상, 우,우,우,우,우) 6:(하,하,하,하,하,하, 좌,좌,좌,좌,좌,좌, 상,상,상,상,상,상,상) 으로 변화한다.

i가 1부터 N-2 까지는 증가할 때 방향회전 방식은 다음과 같다. 상,우,하,좌가 둘 씩 짝지어서 각 방향을 i번 만큼 진행하고 양의방향으로 90도만큼 방향을 회전해서 다시 i번 진행한다. 그리고 다음 방향에서는 직전 방향에서 90도만큼 회전한 방향으로 i+1만큼 진행하고 다시 90도 회전하고 다시 i+1만큼 진행한다. i가 N-2까지는 각 i 번째에서 한 번만 방향회전을 하지만 N-1이 됐을 때는 두 번의 방향 회전을 한다.

그림으로 표현하면 아래와 같다.

여기서 주의할 점이 있다. 방향회전전에 테이블의 위치에 값을 넣고 이동을 하는데 이 규칙 대로라면 제일 마지막 위치 (0,0)은 도착만하고 값을 대입하지 않기 때문에 방향을 다 돌고 난 이후에 따로 값을 넣어 주어야한다.

 

 

정리하면 (값입력), (행,열 이동) 방향 전환을 반복문을 이용해서 적절히 코드를 구현하는 되는 문제였다.

Code

import sys

n = int(input())

find_num = int(input())

table = [[0]*n for _ in range(n)]
dir_row = [-1,0,1,0]
dir_col = [0,1,0,-1]
whar_dir = 0
move_cnt = 1
cur_row = n//2
cur_col = cur_row
cur_num = 1
while cur_num < n**2:
    for move_cnt in range(1,n):
        if move_cnt == n-1:
            for _ in range(3):
                for _ in range(move_cnt):
                    table[cur_row][cur_col] = cur_num
                    if cur_num == find_num:
                        answer = (cur_row,cur_col)
                    cur_num += 1
                    cur_row += dir_row[whar_dir]
                    cur_col += dir_col[whar_dir]
                whar_dir = (whar_dir+1)%4
            else:
                table[cur_row][cur_col] = cur_num
                if cur_num == find_num:
                    answer = (cur_row,cur_col)
        else:
            for _ in range(2):
                for _ in range(move_cnt):
                    table[cur_row][cur_col] = cur_num
                    if cur_num == find_num:
                        answer = (cur_row,cur_col)
                    cur_num += 1
                    cur_row += dir_row[whar_dir]
                    cur_col += dir_col[whar_dir]
                whar_dir = (whar_dir+1)%4
            move_cnt += 1

for row in table:
    print(*row)
print(answer[0]+1,end=" ")
print(answer[1]+1)


'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ:1010] 다리놓기  (0) 2022.05.13
[BOJ:1018] 체스판 다시 칠하기  (0) 2022.05.13
[BOJ:1444] 별찍기 - 7  (0) 2022.05.10
[BOJ:1748] 수 이어 쓰기1  (0) 2022.05.09
[BOJ:1316] 그룹 단어 체커  (0) 2022.05.09
Comments