본문 바로가기
Algorithm

행과 열도 구분 못 하는데 내가 코테를 어떻게 풀어

by daun_up 2026. 2. 24.

쿨하게 못 하는 걸 인정 b... 사실 너무 쪽팔려영 하지만 공부를 안 했으니까 어렵겠지

이제는 그냥 싸피 코테 하나라도 풀은 게 너무 다행이라는 생각만 든다...

https://www.codetree.ai/ko/trails/complete/curated-cards/intro-snail-number-square/description

 

빙빙 돌며 숫자 사각형 채우기 설명 | 코드트리

빙빙 돌며 숫자 사각형 채우기을 통해 문제 요구사항과 입력·출력 예시를 꼼꼼히 확인해 정확한 풀이 전략을 세워보세요.

www.codetree.ai

바보 같아도, dx dy 델타 탐색 부터 다시 하고 있음 왜냐하면 나는... dfs bfs 가 뭔지도 제대로 모르는 전공자였기 때문에

ㄴ 안 알려줬잖아 나

암튼 이 문제는 맨날 하던 dx dy 상하좌우 탐색이 아니라 행과 열 탐색이 헷갈렸다. 잘 보면

N 은 행의 범위이고 M 은 열의 범위라고 한다. 그러므로 따지고 보면 0 <= x < M, 0 <= y < N

그래서 좌표계를 잘 설정해주었다. 처음에 고칠 때는 ans[y][x] 와 같은 식으로 수정했지만, 절대 나중에 실수할 것 같았다. 가독성 한 개도 안 좋음

int[] dr = {0, 1, 0, -1};
int[] dc = {1, 0, -1, 0};

만약 원래 처럼 좌표계를 작성했다면 동, 남, 서, 북 시계 방향으로 (1, 0) (0, 1) (-1, 0) (0, -1) 으로 작성했겠지만 각각 행의 변화량, 열의 변화량을 뜻하므로 위와 같이 작성했다.

자꾸 틀리다가 겨우 고친 엉망 코드

import java.util.Scanner;

public class Main {
    static int n, m;

    static boolean inRange(int y, int x){
        return (y >= 0 && y < n && x >= 0 && x < m);
    }

    // 시계 방향 (동, 남, 서, 북)
    static int[] dx = {1, 0, -1, 0};
    static int[] dy = {0, 1, 0, -1};

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();

        int[][] ans = new int[n][m]; // 답을 적을 배열

        int x = 0, y = 0; // 시작 위치

        int dir = 0; // 동쪽에서 시작

        for(int i = 1; i <= n * m; i++){

            ans[y][x] = i;

            int nx = x + dx[dir];
            int ny = y + dy[dir];

            if(!inRange(ny, nx) || ans[ny][nx] != 0){
                dir = (dir + 1) % 4;   
                nx = x + dx[dir];
                ny = y + dy[dir];
            }
            
            x = nx;
            y = ny; // 실제 이동
        }

        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                System.out.print(ans[i][j] + " ");
            }
            System.out.println();
        }

    }
}

고친 전체 코드

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(); // 세로(행)
        int m = sc.nextInt(); // 가로(열)

        int[][] ans = new int[n][m];

        // 1. 방향 설정 (우 -> 하 -> 좌 -> 상 : 시계 방향)
        // dr: 행(row) 변화량, dc: 열(column) 변화량
        int[] dr = {0, 1, 0, -1};
        int[] dc = {1, 0, -1, 0};

        int r = 0, c = 0, dir = 0;

        for (int i = 1; i <= n * m; i++) {
            ans[r][c] = i;

            // 다음 칸 미리 가보기
            int nr = r + dr[dir];
            int nc = c + dc[dir];

            // 2. 방향 전환 조건 체크 (범위 밖이거나 이미 숫자가 채워진 경우)
            if (nr < 0 || nr >= n || nc < 0 || nc >= m || ans[nr][nc] != 0) {
                dir = (dir + 1) % 4; // 90도 회전
                nr = r + dr[dir]; // 꺾은 방향으로 확인하기
                nc = c + dc[dir];
            }

            r = nr; // 실제 이동
            c = nc;
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                sb.append(ans[i][j]).append(" ");
            }
            sb.append("\n");
        }
        System.out.print(sb);
    }
}

나조차도 내 코드가 너무 어려워서 읽기 좋은 코드를 짜는 사람이 제일 똒똑해 보인다 그리고 실제로 맞음ㅋ 아 짜증나!!!!!!!! 왜나이것도몰라!!!!!!!!!!!!1

앞으로 유의해야 하는 점

dx, dy 로 두고 풀어도 되지만 (상하좌우 탐색 등)

이차원 배열에서는 (x,y) 순서로 데이터를 다루더라도 map[y][x] 로 꼭꼭 표시해주어야한다. 단순히 x, y 니까 map[x][y] 라고 생각하고 지금까지 살아왔는데... 행/열 개념을 확실하게 적용하자! 항상 우선되는 건 행/열 개념!! 이차원 배열이니까