이번에 푼 문제는 실버4단계 문제이다.
내가 왜 갑자기 낮은 단계의 문제를 풀게 되었냐면...
이번에 SK ICT 코테에서 이 문제와 비슷한 문제가 나왔는데 못 풀었기 때문에😭💢
코테 본 지 3일이 넘은 시점에서도 또렷하게 기억나는 아주 인상적인 문제였다.
그 문제는 달팽이 4마리가 움직이고 방향이 시계/반시계 방향 두 가지 모두 생각하는 문제여서 이 문제보다 까다로울 수 있지만 (아마 달팽이 각각을 객체로 두고 풀면 될 듯?) 풀이는 비슷한 방식으로 구현될 것이다.
내가 구현 문제에는 아직 약한 것 같다.
구현 문제를 더 열심히 풀어봐야겠다.
각설하고, 이 문제를 풀 때 1부터 접근하면 풀이가 어려워진다.
나는 처음에는 1을 시작점으로 두고 풀다가 방향 전환 플래그를 설정하는 것이 까다로워서 역방향으로 진행하도록 코드를 짰다.
즉 [0][0]을 시작점으로 반시계방향으로 진행하고 방향은 남, 동, 북, 서 방향으로 전환한다.
package Implementation;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BOJ1913 {
// [0][0]부터 반대로 진행
// 남 -> 동 -> 북 -> 서 방향으로 진행
// 카운트를 -1씩 하면서 진행
static int[][] move = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; // N, E, S, W
static int[][] map;
static int n;
static int target;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
n = Integer.parseInt(br.readLine());
target = Integer.parseInt(br.readLine());
map = new int[n][n];
int dir = 0; // moving direction
int row = 0;
int col = 0;
String answer = "";
// 한 바퀴가 한 세트로
for(int i = n*n; i > 0; i--){
map[row][col] = i;
if(i == target) answer = row+1 + " " + (col + 1);
int nr = row + move[dir][0];
int nc = col + move[dir][1];
if(nr < 0 || nr >= n || nc < 0 || nc >= n || map[nr][nc] != 0) {
dir = (dir + 1) % 4;
nr = row + move[dir][0];
nc = col + move[dir][1];
}
row = nr;
col = nc;
}
for(int[] i : map){
for(int j : i){
sb.append(j).append(" ");
}
sb.append("\n");
}
System.out.println(sb.toString() + answer);
}
}