본문 바로가기

알고리즘 문제풀이/SWEA(SW Expert Academy)

[SWEA][JAVA] 1954 : 달팽이 숫자

문제 출처 : 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

 

문제

 

 

설명

D2문제였지만 난이도가 그것 치고는 꽤 높은 문제였습니다.

패턴의 규칙을 찾아 아이디어로 삼는 것이 중요했는데, 저는 아래쪽, 위쪽으로 갈 경우에는 그 전보다 방문하는 칸의 수가 하나씩 줄어든다는 규칙을 사용했습니다.

또, 루프를 한번 돌 때마다 방향을 1과 -1로 번갈아 설정되게 하여 오른쪽, 아래쪽(각각 y만 증가, x만 증가하므로 dir=1) 또는  왼쪽, 위쪽(각각 y만 감소, x만 감소하므로 dir=-1) 으로 가는 경우를 계산했습니다.

그렇게 반복해서 수를 채워 나가다가, 방문해야 하는 칸의 수가 점점 줄어들어 0이 되면 칸을 다 채웠다는 의미이므로 반복문을 빠져 나와서 결과를 출력했습니다. 

 

 

코드

 

import java.util.Scanner;

public class SWEA1954_snail {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt(); //테케 수

 		
		for(int tc=1; tc<=T; tc++) {
			int n = sc.nextInt();
			int[][] snail = new int[n][n];
			
			//우 하 좌 상 순으로 감
			int x=0, y=-1; //들어가기 전 배열 바깥에 있음
			int dir=1; //우, 하 : 1(y증가 or x증가)  /  좌, 상 : -1 (y감소 or x감소)
			int cnt=1;
			
			while(true) {
				
				for(int i=0; i<n; i++) { //오른쪽, 왼쪽
					y = y+dir;
					snail[x][y] = cnt++;
				}
				
				//아래, 위로 갈때 가는 칸 숫자가 하나씩 줄어듦
				n--;
				if(n==0) break; //종료 조건
				
				for(int i=0; i<n; i++) { //아래, 위쪽
					x= x+dir;
					snail[x][y]=cnt++;
				}
				
				//방향 전환 (오 -> 왼, 아래 -> 위)
				dir = dir*-1;
			}
			
			System.out.println("#"+tc);
			for(int i=0; i<snail.length; i++) {
				for(int j=0; j<snail.length; j++) {
					System.out.print(snail[i][j]+" ");
				}
				System.out.println();
			}
		}
	}
}