최근 올라오는 개발자 공고를 보면 서류없이 코딩테스트를 바로 칠 수 있게 되어 있어 현재 내 코딩테스트 수준을 알고 싶어 여러 회사에 지원해 봤는데 위 문제와 비슷한 유형이 자주 출제되는것 같아서 달팽이 배열을 대표 문제로 유형을 정리해보겠습니다.
문제를 간단하게 설명드리자면 달팽이 껍질 모양처럼 돌면서 숫자를 증가시켜 값을 채우는 것입니다.
아래 입력이 3일때와 4일때의 경우를 보면 쉽게 이해하실 수 있습니다.
코드를 하나씩 쪼개보면 입력 N을 통해서 2차원 배열을 모두 0으로 초기화 시켜줍니다.
N = int(input())
snail = [[0]*N for _ in range(N)]
달팽이 배열 패턴을 보면 (우=>하=>좌=>상) 방향으로 반복해서 이동하는 것을 알 수 있습니다.
또한 , 2차원 배열의 첫번째 요소는 무조건 1부터 시작하기 때문에 1행1열의 값을 1로 설정합니다.
# 방향 전환 ( 우 , 하 , 좌 , 상 )
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
# 방향을 바꿔 줄 변수
dir = 0
x = y = 0
snail[x][y] = 1
우리가 배열을 채우기 위해서는 무조건 N제곱
만큼 반복해야 모든 배열을 채울 수 있고 만일 움직이는 좌표가 범위안에 있고 값을 0으로 가지고 있으면 방향을 바꾸지 않고 반복해서 값을 채웁니다.
for num in range(2, N**2+1):
x += dx[dir]
y += dy[dir]
snail[x][y] = num
if 0 <= x + dx[dir] < N and 0 <= y + dy[dir] < N and snail[x + dx[dir]][y + dy[dir]] == 0:
continue
만일 우리가 채우려는 범위를 벗어나게 된다면 방향을 바꿔서 진행해야 합니다.
(우 => 하 => 좌 => 상) 패턴으로 모든 배열을 채울때까지 움직이기 위해서 방향 : 상
인 상태가 되면 dir=0으로 초기화시켜 다시 우패턴
으로 갈 수 있게 설정합니다.
if dir != 3:
dir += 1
else:
dir = 0
⚒️ 전체 코드
N = int(input())
snail = [[0]*N for _ in range(N)]
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
dir = 0
x = y = 0
snail[x][y] = 1
for num in range(2, N**2+1):
x += dx[dir]
y += dy[dir]
snail[x][y] = num
if 0 <= x + dx[dir] < N and 0 <= y + dy[dir] < N and snail[x + dx[dir]][y + dy[dir]] == 0:
continue
if dir != 3:
dir += 1
else:
dir = 0
print(snail)