D1 문제는 다풀었고 D2 문제를 푸는데 한번에 풀리는 문제들도 많고 생각을 많이해봐야하는 문제들도 많았다. 점점 내가 D3는 풀 수 있을지 의문이 들기시작한다.. 알고리즘 공부 더 열심히해야지



위 문제는 혼자서 풀기어려워서 유튜브 풀이를 보고 공부했다. 생각할게 은근 많은 문제여서 정리해봄.
문제내용은 1~N*N 까지 달팽이 모양으로 숫자를 증가해서 2차원 배열에 집어넣는 문제
규칙은 1부터 보면, 배열 크기까지 오른쪽으로 이동 (j 값 1 증가) -> 아래로 이동 (i 값 1 증가) -> 왼쪽으로 이동 (j 값 1 감소) -> 위쪽으로 이동 ( i 값 1 감소) 이게 핵심이라고 생각한다.
이동방향으로 생각하면
우 하 좌 상
int [] di = {0, 1, 0, -1}
int [] dj = {1, 0, -1, 0}
package SWEA_24_04_26;
import java.util.Scanner;
public class D2_1954Ref {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int test_case = 1; test_case <= T ; test_case++) {
int N = sc.nextInt();
int [][] arr = new int[N][N];
int [] di = {0, 1, 0, -1};
int [] dj = {1, 0, -1, 0};
int i = 0; int j = 0; int dr = 0;
int count = 1;
arr[i][j] = count;
count += 1;
while (count <= N*N){
int si = i + di[dr];
int sj = j + dj[dr];
if (0 <= si && si< N && 0<= sj && sj <N && arr[si][sj] == 0){
i = si;
j = sj;
arr[i][j] = count;
count += 1;
}else dr = (dr+1) % 4;
}
System.out.println("#" + test_case);
for (int k = 0; k < N; k++) {
for (int l = 0; l < N; l++) {
System.out.print(arr[k][l]);
System.out.print(" ");
}
System.out.println(" ");
}
}
}
}
if 문을 보면 들어갈 i 와 j 가 범위 안에 들어가 있어야 하고, 들어갈 칸이 값이 없을때
count 값을 추가하고 그게 아니라면, 방향전환을 해야하기 때문에 dr 값 수정
며칠 있다가 다시 풀어볼 예정이다. 내가 지금 코드를 암기를 한건지 이해를 한건지 나도 잘 모르겠다.