[백준] 1913번: 달팽이

ByWindow·2022년 3월 14일
0

Algorithm

목록 보기
90/104
post-thumbnail

📝문제

이번에 푼 문제는 실버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);
    }
}
profile
step by step...my devlog

0개의 댓글