[SWEA]달팽이 숫자

onyoo·2023년 11월 28일
0

알고리즘

목록 보기
36/39

개요

문제링크

오랜만에 풀어본 달팽이 문제.

좌표배열을 사용하는 것까지는 접근했지만 아쉽게 틀린 문제.
나중에 복기 필수 !

문제분석

이렇게 생긴 2차원 배열을 만들어주면 되는 문제이다.

달팽이 모양으로 들어가며 데이터를 넣어주면 된다.
달팽이 모양을 그리는 건 일정하게 다음과 같은 순서로 진행된다.

오른쪽 -> 아래 -> 왼쪽 -> 위

그럼 이대로 방향좌표를 잡아준 뒤,벽에 부딪힐때마다 방향좌표를 바꿔주면 된다.

여기에서 주의할 점은 방향을 돌릴때마다 방향 카운트를 늘리되 나머지 연산자를 통해 방향좌표의 개수에 맞게 돌아오도록 해주어야 한다.

이말이 무슨말이냐 하면.

0 -> 1 -> 2 -> 3 -> 0 -> 1 -> 2 -> 3 이런식으로 다시 되돌와야 한다는 소리이다. 나머지 연산을 통하면 숫자는 다시 되돌아 올수 있기 때문에 나머지 연산을 사용해야하는 것이고.

여기에서 내가 틀렷던 부분은 방향좌표를 통해 미리 값을 계산해준 다음 유효한지 체크한 것인데,이것이 문제가 되었다.

경계선이전까지 가야하는데 나의 경우는 경계선에 닿고서야 그걸 알았기 때문에 제대로 작동하지 않았던 것이다.

이러한 문제의 경우,조건문에서 값을 체크한 뒤 값을 변경해주어야 한다!

이후 코드는 매우 간단하다 코드를 보자.

문제풀이

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

/**
 * @author onyoo
 * @performance
 * @category
 * @note
 * @see
 * @since 11/27/23
 **/
public class Solution {
	static int T,N;
	static int[][] map;
	static int[] dx = {0,1,0,-1};
	static int[] dy = {1,0,-1,0}; // 오른쪽 아래 왼쪽 위
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		T = Integer.parseInt(br.readLine());

		for(int t=1;t<T+1;t++){
			N = Integer.parseInt(br.readLine());
			map = new int[N][N];

			int dir = 0;
			int x = 0;
			int y = 0;

			for(int idx = 1; idx <= N * N ; idx++){
				map[x][y] = idx;

				if(x + dx[dir] < 0 || x + dx[dir] >= N || y + dy[dir] < 0 || y + dy[dir] >= N || map[x + dx[dir]][y+dy[dir]] != 0){
					dir = (dir + 1) % 4 ; 
                    // 방향좌표를 바꿔주기
                    // 0부터 시작하기 때문에 1을 더해주어야 한다!
				}
				x += dx[dir];
				y += dy[dir];
			}

			System.out.println("#"+t);
			for(int i=0;i<N;i++){
				for(int j=0;j<N;j++){
					System.out.printf("%d ",map[i][j]);
				}
				System.out.println();
			}
		}
	}
}
profile
반갑습니다 ! 백엔드 개발 공부를 하고있습니다.

0개의 댓글