[SWEA] 1954 달팽이 숫자
이 문제는 주어진 n*n 배열에 숫자를 매기는데, 달팽이 모양으로 시계방향으로 돌아가며 숫자를 매겨야 한다.
달팽이 모양을 그리는 단계를 right
, left
, top
, bottom
으로 구분하고 필요한 상황에 부딪혔을 때
flag
를 부여해서 해당 조건을 따를 수 있도록 디자인했다.
첫 flag
는 right
이며
오른쪽 벽이 막혀있거나 오른쪽 항이 양수인 경우에 flag를 전환하도록 했다.
flag는 right → bottom → left → top
순으로 전환되기 때문에 이에 대한 조건 처리만 해주면 됐다.
또한 x
,y
변수를 가지고 미리 만들어둔 matrix
2차원 배열에 접근하여 range(n*n)
범위의 값을 선회하면서 값을 부여할 수 있도록 하였다.
함수를 작성하면 더 복잡해질 것 같아서 냅뒀는데, 더 좋은 풀이가 있을 것 같다.
나의 풀이
t = int(input())
for tc in range(1, t+1):
n = int(input())
matrix = [[0]*n for _ in range(n)]
x = 0
y = 0
flag = "r"
for i in range(n*n):
matrix[x][y] = i+1
if flag=="r":
if y == n-1:
flag="b"
x+=1
else:
if matrix[x][y+1]:
flag="b"
x+=1
else:
y += 1
elif flag == "b":
if x == n-1:
flag="l"
y -= 1
else:
if matrix[x+1][y]:
flag="l"
y -= 1
else:
x += 1
elif flag == "l":
if y-1 < 0:
flag = "t"
x -= 1
else:
if matrix[x][y-1]:
flag="t"
x -= 1
else:
y -= 1
elif flag == "t":
if x-1 < 0:
flag = "r"
y+=1
else:
if matrix[x-1][y]:
flag="r"
y+=1
else:
x -= 1
print(f"#{tc}")
for m in matrix:
for c in m:
print(c, end=" ")
print("") #줄바꿈