[SWEA] [D2] 달팽이 숫자 - 1954

ejjem·2025년 3월 24일

코딩테스트

목록 보기
5/20

문제 풀이 날짜: 2025-03-24

💡Github URL

: https://github.com/ejjem/coding-test/tree/main/SWEA/D2/1954.%E2%80%85%EB%8B%AC%ED%8C%BD%EC%9D%B4%E2%80%85%EC%88%AB%EC%9E%90

💡문제에서 구해야 할 것

문제 조건 :

  • 달팽이는 1부터 N*N까지의 숫자가 시계방향으로 이루어져 있음.
  • 정수 N을 입력 받아 N크기의 달팽이를 출력하라.
N = 3
1 2 3
8 9 4
7 6 5

N = 4
 1  2  3 4
12 13 14 5
11 16 15 6
10  9  8 7

[제약사항]

  • 달팽이의 크기 N은 1 이상 10 이하의 정수. (1 ≤ N ≤ 10)

  • 입력
    • 가장 첫 줄에는 테스트 케이스의 개수 T가 주어짐.
    • 그 아래로 각 테스트 케이스 N이 주어짐.
  • 출력
    • 각 줄은 '#t'로 시작. (t는 테스트 케이스 의 번호를 의미, 1부터 시작)
    • 다음 줄부터 빈칸을 사이에 두고 달팽이 숫자를 출력.

💡알고리즘 설계

  1. N을 입력아 변수에 저장.
  2. [0]으로 초기화한 N*N 배열 data를 생성함.
  3. data의 [0][0]은 1로 넣고, cnt = 1, index = N을 생성함.
    • cnt: 채운 칸의 숫자를 의미
    • N: 현재 진행중인 껍질의 N을 의미
  4. for문을 선언 ( i는 2 ~ N^2 까지 )
    • 채우는 칸: data[row][col]
    • 채운 칸의 수가 N이 될 때 까지 우측으로 전진.
    • 이후 채운 칸의 수가 N + (N-1)이 될 때 까지 아래로 전진.
    • 이후 채운 칸의 수가 N + (N-1) + (N-1)이 될 때 까지 좌측으로 전진.
    • 이후 채운 칸의 수가 N + (N-1) + (N-1) + (N-2)가 될 때 까지 위로 전진.
      • 즉, 우로 N 전진 → 아래로 N-1 전진 → 좌로 N-1 전진 → 위로 N-2 전진
    • 한 바퀴 돌고 나면 index를 2 감소시켜 작은 달팽이로 들어가도록 변경
  5. 모든 시행이 끝나면 출력

💡코드

메모리: 52,352 KB, 시간: 57 ms, 코드길이: 844 Bytes

T = int(input())
answer = []
for num in range(1, T+1):
  N = int(input())
  data = [[0]* N for _ in range(N)]
  row, col = 0, 0
  data[row][col] = 1
  cnt = 1
  index = N

  def print_matrix(matrix):
    for row in matrix:
        print(" ".join(f"{x}" for x in row))
          
  for i in range(2, N ** 2 + 1):
    if cnt == (4*index - 4):
      index -= 2
      cnt = 0
      
    if cnt <= index - 1:
      cnt += 1
      col += 1
        
    elif index <= cnt <= 2*index - 2:
      cnt += 1
      row += 1
        
    elif 2*index - 1 <= cnt <= 3*index - 3:
      cnt += 1
      col -= 1
        
    elif 3*index - 2 <= cnt <= 4*index - 5:
      cnt += 1
      row -= 1
        
    data[row][col] = i
  
  answer.append(f"#{num}")
  for row in data:
    answer.append(" ".join(f"{x}" for x in row)) 
    
print("\n".join(answer))
    
 

💡시간복잡도

  • 외부 시간 복잡도
    • for문 → O(N)
  • 내부 시간 복잡도
    • for문 → O(N^2)
  • 최종 시간 복잡도
    • O(N) * O(N^2) = O(N^3)

💡 틀린 이유 & 틀린 부분 수정

맞음.

💡 다른 풀이 or 기억할정보

  • 방향을 조작하는 방식
    • 자주 쓰는 방식이라 이걸 기억하는 것도 좋을듯.
N = 3
matrix = [[0] * N for _ in range(N)]

dx = [0, 1, 0, -1]  # 행 이동 (→ ↓ ← ↑)
dy = [1, 0, -1, 0]  # 열 이동

x, y, dir = 0, 0, 0  # 시작 위치, 방향

for num in range(1, N * N + 1):
    matrix[x][y] = num
    nx, ny = x + dx[dir], y + dy[dir]

    if 0 <= nx < N and 0 <= ny < N and matrix[nx][ny] == 0:
        x, y = nx, ny
    else:
        dir = (dir + 1) % 4  # 방향 전환
        x, y = x + dx[dir], y + dy[dir]
profile
개발자 지망생

0개의 댓글