백준 1913 - 달팽이
Updated:
Java
1913 번 - 달팽이
문제
접근 방법
중심 점에서 이동하는 방향을 보니, 위로 1칸 -> 오른쪽 1칸 -> 아래로 2칸 -> 왼쪽 2칸 -> 위로 3칸 ….
의 방법으로 한번 방향을 바꿀 때 까지 [1, 1, 2, 2, 3, 3, 4, 4, 5, 5…]칸의 이동을 한다는 패턴을 발견하였다.
따라서, 위의 패턴대로 구상하여 해결
코드
import java.util.*;
import java.io.*;
public class Main {
static int n, result, k;
public static void main(String[] args) throws IOException {
//System.setIn(new FileInputStream("res/mainInput.txt")); //제출 할 때 주석해야함
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = stoi(br.readLine());
k = stoi(br.readLine());
int[][] snail = new int[n][n];
int cnt = 1;
int y = n / 2; // 처움 중심 점
int x = n / 2; // 처움 중심 점
int rY = 0, rX = 0;
// 상 우 하 좌
int[] dy = {-1,0,1,0};
int[] dx = {0,1,0,-1};
boolean next = false;
int dirBrdr = 1; // 현재 방향으로 최대 몇 칸 까지 이동할 수있는가
int dirCngCnt = 0; // 현재 방향으로 지금까지 몇칸 갔는지
int dirIdx = 0; // 현재 방향
while(cnt <= n * n) {
snail[y][x] = cnt;
if(cnt == k) {
rY = y;
rX = x;
}
cnt++;
y += dy[dirIdx];
x += dx[dirIdx];
dirCngCnt++;
if(dirBrdr == dirCngCnt) { // 만약 현재 방향으로 갈 수있는 만큼 이동 하였을 때
dirCngCnt = 0;
dirIdx = (dirIdx + 1) % 4; // 방향 전환
if(!next) {
next = true;
}
else { // 짝수번 만큼 이동
dirBrdr++; // 다음 번의 방향에서는 한번 더 움직일 수 있다.
next = false;
}
}
}
// 결과 출력
StringBuilder sb = new StringBuilder();
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
sb.append(snail[i][j]).append(" ");
}
sb.append("\n");
}
sb.append(rY + 1).append(" ").append(rX + 1);
System.out.println(sb.toString());
br.close();
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}
총평
후기
간단한 탐색 문제였다.