알고리즘/구현

SWEA(SW EXPERT ACADEMY) - 1954번 : 달팽이 숫자 - JAVA

naksnaks 2021. 1. 21.
반응형

SW Expert Academy의 문제를 풀고싶으시다면 링크를 눌러주세요.

 

https://swexpertacademy.com/

 

SW Expert Academy

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

swexpertacademy.com

[문제]

2차원 배열에 달팽이가 (0, 0)부터 우측으로 한칸씩 이동하고 벽에 부딫히면 아래로, 좌측으로, 그리고 위로 순서대로 계속 이동하여 빈칸을 채워가는 문제입니다.


[풀이]

이 문제에서 제일 중요한 개념은 벽이나 이미 쓰여진 공간에 도착했을 때 어떻게 방향을 전환할 것인가 입니다.

우선 1차원 배열 dr과 dc를 만들어 (0,1), (1,0), (0,-1), (-1,0)을 대입하여 줍니다.

 

그리고 달팽이가 지나간 자리인지 확인을 하여야하고 계속 반복하여 4가지 방향을 반복해야 하기 때문에

 

방향전환 변수인 d를 설정하여 방향이 변화할 때 마다 d = (d + 1) % 4 를 하여 4가지가 계속 반복이 되도록 만들면 문제가 해결이 됩니다.

 

 

 

SW Expert Academy 알고리즘 1954번 JAVA풀이

 

 

 

 

 

import java.util.Scanner;

public class Solution {
	static int T;
	static int N;
	static int[][] snail;
	static int[] dr = { 0, 1, 0, -1 };
	static int[] dc = { 1, 0, -1, 0 };

	public static void main(String[] args) {
		Scanner scann = new Scanner(System.in);
		T = scann.nextInt();
		for (int t = 1; t <= T; t++) {
			N = scann.nextInt();
			snail = new int[N][N];
			int r = 0;
			int c = 0;
			int d = 0;
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < N; j++) {
					snail[r][c]=i*N+j+1;
					if(!(check(r+dr[d], c+dc[d])
							&& snail[r+dr[d]][c+dc[d]]==0)) {
						 d=(d+1)%4;
					}
					r+=dr[d];
					c+=dc[d];
				}
			}
			System.out.println("#"+t);
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < N; j++) {
					System.out.print(snail[i][j]+" ");
				}
				System.out.println();
			}
		}
	}
	public static boolean check(int rr, int cc) {
		if(rr>=0 && rr<N && cc>=0 && cc<N) {
			return true;
		} else {
			return false;
		}
	}
	
}

 

 

 

궁금하신 부분이나 부족한 점은 댓글로 알려주시면 감사하겠습니다.

 

 

반응형

댓글

💲 추천 글