[백준] 달팽이 (1913번) - Python

Junghyeon Song·2022년 6월 11일
0
post-custom-banner

문제

아이디어

  • 중심에서 시작
  • 이전 숫자로부터 한방향으로 n칸씩 움직이면서 숫자 표시
    • 오른쪽 방향과 왼쪽 방향은 움직이는 칸 수가 이전 방향과 같음
      (위쪽 = 오른쪽, 아래쪽 = 왼쪽)
    • 위쪽 방향과 아래쪽 방향은 움직이는 칸 수가 이전 방향보다 +1

코드

Point

  • 현재까지 방향전환을 몇 번 했는지 count에 저장함.
  • 이 방향으로 몇칸까지 움직여야하는가 == count // 2 + 1
    (4개 방향을 2개로 묶어주기 위해 2로 나누고 시작 숫자 1 더함)
  • 중심에 1을 넣고 반복문으로 들어가기 때문에 찾고자 하는 수가 1인 경우는 미리 체크
  • 이동하다가 배열 범위 초과할 수 있으므로 숫자 체크하면서 반복문 돌기

from sys import stdin


input = stdin.readline
last = int(input())
find = int(input())


board = [[0] * last for _ in range(last)]

num = 1
count = -1
i = j = last // 2
last = last ** 2 + 1


board[i][j] = num
num += 1

coordinate = '' if find != 1 else f'{i+1} {j+1}'

while num < last:
    for _i, _j in ((-1, 0), (0, 1), (1, 0), (0, -1)):
        count += 1
        for _ in range(count//2+1):
            if num == last:
                break
            i += _i
            j += _j
            board[i][j] = num

            if num == find:
                coordinate = f'{i+1} {j+1}'

            num += 1

        if num == last:
            break


for line in board:
    print(*line, sep=' ')

print(coordinate)
post-custom-banner

0개의 댓글