2 분 소요



https://www.acmicpc.net/problem/1913



🔍 문제 풀이

문제 도식화

1004 도식화

  1. 중앙에서 시작
    • n은 홀수 -> n / 2는 항상 중앙 좌표
  2. 달팽이 배열은 1부터 n * n까지 채워야 하므로 종료 조건 필요
    • if (num == n * n) break;
  3. 4방향 회전 구하기 -> 방향 벡터 배열 정의(상 우 하 좌)
  4. 방향을 두 번 바꿀 때마다 step이 1씩 증가
    • 한 방향으로 step칸 이동하면 회전
    • 회전을 2번 하면 step 증가



배운점

처음에 어떤 동작 흐름이 필요한지를 정확히 정리하는 것이 중요하다고 느꼈다.

이 문제에선 “2번 회전마다 이동거리가 증가한다” 는 규칙이 핵심인데,
이를 구현하려면 자연스럽게 다음과 같은 상태 정보를 기억해야 한다.

  • 현재 어느 방향으로 이동 중인지 -> dir
  • 현재 방향에서 몇 칸 이동했는지 -> cnt
  • 몇 번 방향을 바꿨는지 -> turnCnt
  • 한 방향으로 이동할 목표 거리 -> step

앞으로는 구현 전에 “변화하는 값이나 조건은 무엇인지” 를 먼저 파악하고, 그에 맞는 변수 설계를 하는 습관을 들이자.



💻 전체 코드

import java.io.*;

public class Main {
    static int[][] arr;
    static int n, target;

    // 상 우 하 좌
    static int[] dx = {-1, 0, 1, 0};
    static int[] dy = {0, 1, 0, -1};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        n = Integer.parseInt(br.readLine());
        target = Integer.parseInt(br.readLine());

        arr = new int[n][n];

        int resultRow = 0;
        int resultCol = 0;

        solve();

        // 결과 출력
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                sb.append(arr[i][j]).append(" ");
                if (arr[i][j] == target) {
                    resultRow = i + 1;
                    resultCol = j + 1;
                }
            }
            sb.append("\n");
        }

        sb.append(resultRow).append(" ").append(resultCol);
        System.out.println(sb);
    }

    public static void solve() {
        int row = n / 2;
        int col = n / 2;

        int dir = 0; // 현재 방향
        int step = 1; // 한 방향으로 몇 칸 갈지
        int cnt = 0; // 현재 방향에서 이동한 칸 수
        int turnCnt = 0; // 방향을 몇 번 바꿨는지 (두 번 바꾸면 step 증가)

        for (int num = 1; num <= n * n; num++) {
            arr[row][col] = num; // 현재 위치에 숫자 넣고
            row += dx[dir % 4]; // 다음 위치로 이동
            col += dy[dir % 4];
            cnt++; // 한 칸 이동했으니 카운트 증가

            // 이동 step만큼 한 방향으로 다 이동했으면 방향 전환
            if (cnt == step) {
                dir++; // 방향 전환
                cnt = 0; // 다시 0부터 이동 시작
                turnCnt ++; // 방향 전환 횟수 증가

                // 두 번 전환했으면 step 증가(이동거리 증가)
                if (turnCnt == 2) {
                    step++;
                    turnCnt = 0;
                }
            }
        }
    }
}



📎 참조

https://hanyeop.tistory.com/333


카테고리:

업데이트:

댓글남기기