0928. dxdy(5)

sea·2023년 9월 28일
0

알고리즘

목록 보기
10/14

문제

n * m크기의 직사각형에 숫자 1부터 순서대로 증가시키며 달팽이 모양으로 채우는 코드를 작성해보세요.

달팽이 모양이란 왼쪽 위 모서리에서 시작해서, 오른쪽, 아래쪽, 왼쪽, 위쪽 순서로 더 이상 채울 곳이 없을 때까지 회전하는 모양을 의미합니다.

n :(row), m :(column)을 의미합니다.

내 답(오답)

n, m = map(int, input().split())

output = [
    [0] * n
    for _ in range(m)
]

'''
1. 숫자 1부터 순서대로 증가시킴
2. nx, ny 의 range 확인
3. 그 자리에 != 0 이면 옆으로 돌아가야 돼


'''

# initial
x, y = 0, 0
output[x][y] = 1
dir_num = 0
dxs, dys = [0, 1, 0, -1], [1, 0, -1, 0]


def in_range(x, y):
    return 0 <= x and x < n and 0 <= y and y < m

# 1은 이미 initial 로 채웠으니 2부터 채우기
for i in range(2, n * m + 1):
    nx, ny = x + dxs[dir_num], y + dys[dir_num]

    if not in_range(nx, ny) or output[nx][ny] != 0:
        dir_num = (dir_num + 1) % 4

    # 실제 채우는 쪽 함수
    x, y = x + dxs[dir_num], y + dys[dir_num]
    output[x][y] = i

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

진짜 어처구니 없는 실수를 저지름
제발,,,;;

초기 output 함수 지정,, n, m 꼴
-> 앞으로는 실수 없게 그냥 그려서 확인하자, 같은 느낌으로 xy 좌표계도 심심찮게 실수하는 듯
이건 경험치가 쌓이면 해결될 거라고 믿으며,,

profile
달려가는중

0개의 댓글