문제 풀이 날짜: 2023.07.25
포스트 작성일: 2023.07.25

 

* 학습 목적으로 작성하는 글입니다. 풀이가 정석적이지 못할 수도 있습니다.

 

문제 출처

Software Expert Academy 1954번: 달팽이 숫자 (D2)

 

키워드

배열 다루기, 구현

 

풀이 접근법

  • 달팽이 껍질 처럼 빙글빙글 도는 모양으로 배열 값을 대입해야 한다. 
  • 배열이 꺾이는 부분은 dx, dy로 구현한다. 이동 경로가 꺾이는 부분에서 델타 값을 변경하면 이를 구현할 수 있다.
  • 이동 경로가 꺾여야 하는 기준은 두 가지로 잡는다.
    • 1. 이미 0이 아닌 다른 값이 채워져 있다면 경로 변경
    • 2. 배열의 범위를 넘어선 곳을 탐색하려고 했다면 경로 변경

 

코드

import java.io.*;

public class Main {
	
	private static int[] dx = {1, 0, -1, 0}; //→↓←↑
	private static int[] dy = {0, 1, 0, -1};
	
	private static int N;
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());

		StringBuilder sb = new StringBuilder();
		for(int test_case = 1; test_case <= T; test_case++) {
            N = Integer.parseInt(br.readLine());
            
            int[][] matrix = new int[N][N];
            
            int idx = 0;
            int r = 0;
            int c = 0;
            for(int k = 1; k <= N * N;) {  
            	int nr = 0;
                int nc = 0;
            	if(matrix[r][c] != 0) { //다음 위치로 인덱스 변경
            		nr = r + dy[idx];
            		nc = c + dx[idx];
            	}   
            	
            	//이미 값이 채워져 있거나, 배열 범위를 넘어섰다면
            	if(!isValidIndex(nr, nc) || matrix[nr][nc] != 0) { //방향 전환
            		idx++;
            		if(idx >= dx.length) {
            			idx = idx % dx.length;
            		}
            		continue;
            	}
            	
            	matrix[nr][nc] = k++;
            	r = nr;
            	c = nc;
            }
            
            sb.append("#").append(test_case).append("\n");
			for(int i = 0; i < N; i++) {
				for(int j = 0; j < N; j++) {
					sb.append(matrix[i][j]).append(" ");
	            }
				sb.append("\n");
            }
		}
		
		System.out.print(sb.toString());
	}

	private static boolean isValidIndex(int nr, int nc) {
		return (nr > -1 && nc > -1 && nr < N && nc < N);
	}

}

 

 

git 링크

(git 링크 첨부)

+ Recent posts