차곡차곡

[SWEA/Python, Java] SW Expert Academy 1954번 - 달팽이 숫자 본문

CS/Algorithm

[SWEA/Python, Java] SW Expert Academy 1954번 - 달팽이 숫자

sohy 2023. 8. 2. 13:31

SW Expert Academy #1954 달팽이 숫자

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

Python ver.

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

def moving():
    dx, dy = [-1, 0, 1, 0], [0, 1, 0, -1]
    dir_num = 1
    x, y = 0, -1
    for i in range(1, n*n+1):
        nx, ny = x + dx[dir_num], y + dy[dir_num]
        if not in_range(nx, ny) or grid[nx][ny] != 0:
            dir_num = (dir_num + 1) % 4
        x, y = x + dx[dir_num], y + dy[dir_num]
        grid[x][y] = i


T = int(input())
for t in range(1, T+1):
    n = int(input())
    grid = [[0] * n for _ in range(n)]
    moving()
    print(f"#{t}")
    for i in range(n):
        print(*grid[i])

 

Java ver.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Solution {
	
	static int n;
	static int[][] grid;
	
	public static boolean inRange(int x, int y) {
		return 0 <= x && x < n && 0 <= y && y < n;
	}
	
	public static void moving() {
		int[] dx = {-1, 0, 1, 0};
		int[] dy = {0, 1, 0, -1};
		int dirNum = 1;
		int x = 0;
		int y = -1;
		int nx, ny;
		for (int i = 1; i < n*n+1; i++) {
			nx = x + dx[dirNum];
			ny = y + dy[dirNum];
			if (!inRange(nx, ny) || grid[nx][ny] != 0) {
				dirNum = (dirNum + 1) % 4;
			}
			x = x + dx[dirNum];
			y = y + dy[dirNum];
			grid[x][y] = i;
		}
	}

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int T = Integer.parseInt(br.readLine());  // 테스트케이스 수
		for (int i = 1; i <= T; i++) {
			n = Integer.parseInt(br.readLine());  // 달팽이의 크기
			grid = new int[n][n];
			moving();
			System.out.println("#" + i);
			
			for (int j = 0; j < n; j++) {
				for (int j2 = 0; j2 < n; j2++) {
					System.out.printf("%d ", grid[j][j2]);
				}
				System.out.println();
			}
		}
		
		
	}

}

 


 

이동 방향에 번호를 붙이고, 그 번호를 dx, dy 인덱스로 사용한다. dx, dy 리스트 원소는 각 이동 방향에 맞춰 채워준다.

 

시계 방향으로 회전하는 문제가 나오면 0, 1, 2, 3을 시계 방향으로 적어주는 것이 중요!

  • 90˚ 회전 ⇒ dir_num = (dir_num + 1) % 4
  • -90˚ 회전 ⇒ dir_num = (dir_num - 1 + 4) % 4

(4 : 음수를 양수로 바꿔줌)

 

Comments