[SWEA] 1954 달팽이 숫자

[SWEA] 1954 달팽이 숫자

문제 링크

이 문제는 주어진 n*n 배열에 숫자를 매기는데, 달팽이 모양으로 시계방향으로 돌아가며 숫자를 매겨야 한다.


달팽이 모양을 그리는 단계를 right, left, top, bottom 으로 구분하고 필요한 상황에 부딪혔을 때

flag를 부여해서 해당 조건을 따를 수 있도록 디자인했다.

flagright이며

오른쪽 벽이 막혀있거나 오른쪽 항이 양수인 경우에 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("") #줄바꿈

© 2021. All rights reserved.