[Algorithm/Java] 백준 1913번 - 달팽이
https://www.acmicpc.net/problem/1913
🔍 문제 풀이
문제 도식화
- 중앙에서 시작
- n은 홀수 ->
n / 2
는 항상 중앙 좌표
- n은 홀수 ->
- 달팽이 배열은
1
부터n * n
까지 채워야 하므로 종료 조건 필요if (num == n * n) break;
- 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
댓글남기기