[ 코테 ] 달팽이 배열

HP :) 😃·2022년 3월 16일
0
post-thumbnail

안녕하세요 hp입니다 :)

최근 올라오는 개발자 공고를 보면 서류없이 코딩테스트를 바로 칠 수 있게 되어 있어 현재 내 코딩테스트 수준을 알고 싶어 여러 회사에 지원해 봤는데 위 문제와 비슷한 유형이 자주 출제되는것 같아서 달팽이 배열을 대표 문제로 유형을 정리해보겠습니다.

📚 문제

문제를 간단하게 설명드리자면 달팽이 껍질 모양처럼 돌면서 숫자를 증가시켜 값을 채우는 것입니다.

아래 입력이 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)
profile
끊임없이 노력하는 개발자

0개의 댓글