https://www.acmicpc.net/problem/1913
1913번: 달팽이
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서
www.acmicpc.net
문제 풀이 (JAVA)
package baekjoon;
import java.util.Scanner;
public class Dalpeng {
public static void main(String[] args) {
// 달팽이 (벡준 실버4 구현)
StringBuilder sb = new StringBuilder();
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int num = in.nextInt();
int[][] arr = new int[N][N];
char[] dir = { 'W', 'N', 'E', 'S' }; // 방향을 가리킬 서,북,동,남 변수
int lnum = N * N; // (0,0) 초기입력숫자
int idx = 3, i = 0, j = 0; // 방향 인덱스(3='남'), 배열 인덱스 선언
boolean[][] flag = new boolean[N][N]; // 방문했는지 여부 이차원배열
while (lnum > 0) { // 1보다 작으면 멈춤.
arr[i][j] = lnum;
flag[i][j] = true;
// 남쪽일때 인덱스처리
if (dir[idx] == 'S') {
if (i + 1 < N && flag[i + 1][j] == false) {
i++;
} else {
idx--;
j++;
}
}
// 동쪽일때 인덱스처리
else if (dir[idx] == 'E') {
if (j + 1 < N && flag[i][j + 1] == false) {
j++;
} else {
idx--;
i--;
}
}
// 북쪽일때 인덱스처리
else if (dir[idx] == 'N') {
if (i - 1 > -1 && flag[i - 1][j] == false) {
i--;
} else {
idx--;
j--;
}
}
// 서쪽일때 인덱스처리
else if (dir[idx] == 'W') {
if (j - 1 > -1 && flag[i][j - 1] == false) {
j--;
} else {
idx = 3;
i++;
}
}
lnum--;
}
int row = 0;
int col = 0;
for (int k = 0; k < N; k++) {
for (int l = 0; l < N; l++) {
sb.append(Integer.toString(arr[k][l]) + " "); // System.out을 사용하면 타임아웃이 나므로 StringBuilder 사용.
if (num == arr[k][l]) {
row = k + 1; // 발견하고 싶은 숫자의 행
col = l + 1; // 발견하고 싶은 숫자의 열
}
}
sb.append("\n");
}
System.out.print(sb); // StringBuilder를 사용하여 한번에 출력
System.out.print(row + " " + col); // 찾고자 하는 숫자 행,열 출력
}
}
주요 핵심 포인트
1. 배열 (0,0) 부터 바깥쪽 -> 안쪽 으로 구하는 방식을 썼다.
2. 배열의 끝을 판별하여 끝이 아니라면 dir 배열에 있는 식을 돌고, 끝이라면 dir의 idx를 감소하여 다음 방향을 반복하였다.
3. 끝이 아니여도 flag 이차원 배열을 이용하여 false인 경우, 방문하지 않았음을 판별하여 방문했을시 dir의 idx 감소하여 방향을 전환하였다.
4. System.out 으로 배열을 한개씩 출력시 시간초과가 뜨기 때문에 StringBuilder를 생성하여 반복문을 통한 값을 한번에 담아 출력하였다.
개선해야할 사항
1. dir 방향 인덱스를 더 잘 이용 할 수 있는 방법이 없나 생각해보아야 하며, while문이 아닌 for문을 사용하여 푸는 방법 또한 연구해보아야 할듯하다. 또한 출력 되어야 하는 값이 많을 시, StringBuilder에 담아 출력하는 습관을 들여 시간초과 오류를 피해야 한다.
'백준(JAVA)' 카테고리의 다른 글
[백준 2583번] 영역 구하기 (0) | 2023.02.12 |
---|---|
[백준 11403번] 경로 찾기 (0) | 2023.02.10 |
[백준 1806번] 부분합 (0) | 2022.12.04 |
[백준 1260번] DFS와 BFS (0) | 2022.12.04 |
단어 뒤집기2 (0) | 2022.07.09 |