반응형
SW Expert Academy의 문제를 풀고싶으시다면 링크를 눌러주세요.
[문제]
2차원 배열에 달팽이가 (0, 0)부터 우측으로 한칸씩 이동하고 벽에 부딫히면 아래로, 좌측으로, 그리고 위로 순서대로 계속 이동하여 빈칸을 채워가는 문제입니다.
[풀이]
이 문제에서 제일 중요한 개념은 벽이나 이미 쓰여진 공간에 도착했을 때 어떻게 방향을 전환할 것인가 입니다.
우선 1차원 배열 dr과 dc를 만들어 (0,1), (1,0), (0,-1), (-1,0)을 대입하여 줍니다.
그리고 달팽이가 지나간 자리인지 확인을 하여야하고 계속 반복하여 4가지 방향을 반복해야 하기 때문에
방향전환 변수인 d를 설정하여 방향이 변화할 때 마다 d = (d + 1) % 4 를 하여 4가지가 계속 반복이 되도록 만들면 문제가 해결이 됩니다.
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;
}
}
}
궁금하신 부분이나 부족한 점은 댓글로 알려주시면 감사하겠습니다.
반응형
'알고리즘 > 구현' 카테고리의 다른 글
BJ_G4_20058_마법사 상어와 파이어스톰 - Java (0) | 2022.01.30 |
---|---|
BJ_B2_15552_빠른A+B - Java (0) | 2022.01.20 |
BOJ(백준알고리즘) - 10872번 : 팩토리얼 - JAVA (2) | 2021.01.19 |
SWEA(SW Expert Academy) - 1986번 : 지그재그 숫자 - JAVA (0) | 2021.01.19 |
BOJ(백준알고리즘) - 15963번 : CASIO - JAVA (0) | 2021.01.18 |
댓글