문제 풀이 날짜: 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 링크 첨부)
'Study > Problem Solving' 카테고리의 다른 글
[백준 / Java] 2941번: 크로아티아 알파벳 (실버5) (0) | 2023.07.25 |
---|---|
[SWEA / Java] 1493번: 수의 새로운 연산 (D3) (0) | 2023.07.25 |
[SWEA / Java] 1979번: 어디에 단어가 들어갈 수 있을까 (D2) (0) | 2023.07.24 |
[백준 / Java] 10971번: 외판원 순회2 (실버2) (0) | 2023.05.25 |
[SWEA / Java] 1859번: 백만 장자 프로젝트 (D2) (0) | 2023.05.25 |