[java] SWEA - 1954 달팽이 숫자

동훈·2024년 4월 26일

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 값 수정

며칠 있다가 다시 풀어볼 예정이다. 내가 지금 코드를 암기를 한건지 이해를 한건지 나도 잘 모르겠다.

profile
성실함 한스쿱

0개의 댓글