AngelPlayer`s Diary

링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PobmqAPoDFAUq&categoryId=AV5PobmqAPoDFAUq&categoryType=CODE&problemTitle=1954&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1 

 

SW Expert Academy

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

swexpertacademy.com

 

 

 

문제 해석

숫자 N이 주어질 때, N * N 배열을 돌아가면서 1 ~ (N*N)까지 숫자를 입력하기

 

 

 

코드

import java.io.*;
import java.util.*;

public class Solution {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int T = Integer.parseInt(st.nextToken());
		
		int[] dx = {0, 1, 0, -1};
		int[] dy = {1, 0, -1, 0};
		
		
		for(int test_case = 1; test_case <= T; test_case++) {
			st = new StringTokenizer(br.readLine());
			int N = Integer.parseInt(st.nextToken());
			
			int nowNum = 1;
			int[][] arr = new int[N][N];
			
			int cx = 0; // 시작  x 위치
			int cy = -1; // 시작  y 위치
			int rotateNow = 0; // 이동 방향
			
			while (true) {
				if (nowNum > N * N) {
					break;
				}
				
				if (cx + dx[rotateNow] < 0 || cx + dx[rotateNow] >= N ||
					cy + dy[rotateNow] < 0 || cy + dy[rotateNow] >= N ||
					arr[cx + dx[rotateNow]][cy + dy[rotateNow]] != 0) {
					rotateNow = (rotateNow + 1) % 4;
				}
				
				cx = cx + dx[rotateNow];
				cy = cy + dy[rotateNow];
				
				arr[cx][cy] = nowNum;
				nowNum++;
			}
			
			System.out.print("#" + test_case + "\n");
			print(arr);
			
			
		} // [E] test_case
	}

	private static void print(int[][] arr) {
		for (int r = 0; r < arr.length; r++) {
			for (int c = 0; c < arr[r].length; c++) {
				System.out.print(arr[r][c] + " ");
			}
			System.out.println();
		}
	}
}

 

 

 

코드 해석

달팽이 문제의 핵심은 언제 내가 방향을 바꿔서 숫자를 입력할 것인지를 결정하는데 있습니다.

 

 

3*3 행렬을 예로 들면,

 

시작위치에서부터 3까지는 동일한 방향으로 나아가다가 행렬을 벗어나려고 할 때 아래로 꺾이는 모습을 볼 수 있습니다.

5에서 6과, 7에서 8로 넘어가는 부분에서도 마찬가지 현상이 나타납니다.

 

그리고 행렬을 벗어나는 것 이외에도 8번에서 9번으로 넘어가는 경우처럼, 이미 배열에 숫자가 차 있다면(0이 아닌 숫자가 입력되어 있다면) 방향을 바꿔주어야 합니다.

 

 

방향은 시계방향으로 계속 꺾이는 것을 확인 할 수 있으며, 꺾이는 조건과 꺾이는 방향 정보를 적절히 활용하여 문제를 해결할 수 있습니다.

 

 

 

발생한 문제 & 해결 방안

--

 

 

 

 

 

 

 

 

공유하기

facebook twitter kakaoTalk kakaostory naver band