알고리즘 스터디 7월 4주차 문제1 (달팽이 숫자)

문제#

  • 링크로 대체

풀이 및 주저리..

SSAFY에서 자바 오프라인 수업 첫날 남는 시간에 풀어보라고 추천을 해주셔서 풀어본 문제이다. 지금까지 배운 내용은 배열까지라 간단하게 생각하고 시도했다가 꽤 생각을 오래하게 된 문제이다. 먼저 for 문을 사용해서 풀어볼 것이냐.. while을 쓸 것이냐.. 이런 저런 고민과 테두리를 0부터 N-1까지로 네부분으로 쪼개면서 풀어도 어떻게 잘하면 풀 수 있을 것 같은 다양한 풀이방식중에 하나를 선택하는 것이 고민이였다. 처음에는 네부분으로 쪼개면서 풀어보려했지만.. 실패하고 말았다. 과거 백준 문제중에 게리맨더링인가? 하는 선거 구역을 나누는 문제가 있었는데 거기서도 이런 비슷한 개념이 사용된 것 같은데.. 결국 못풀었지만 아무튼..

풀이로 가장 중요한 것은 코드상의 while문 안의 어마어마한 조건식.. 이였던 것 같다. 전체 크기의 안쪽이면서 방향에 따라 처리를 해주기 위해서 조건식이 길어지게 되었고 한쪽방향의 끝까지 가줘야하다보니 좀 지저분해지는 느낌이 있었다. 네방향 처리를 해주는것도 조금 맘에 걸렸지만.. 더 좋은 코드가 생각나질 않아서.. 더 좋은 코드가 생각난다면? 돌아올수도 있다.

코드

package ssafy.swexpert.d2;

import java.util.Scanner;

public class Problem1954 {
    static final int[] dx = {0, 1, 0, -1}, dy = {1, 0, -1, 0};

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int iT = sc.nextInt();
        for (int i = 1; i <= iT; i++) {
            int N = sc.nextInt();
            int[][] answerMap = new int[N][N];
            // 0 0
            int x = 0;
            int y = 0;
            int dir = 0;
            int num = 1;
            int temp = 0;

            //처음 시작 처리
            answerMap[x][y] = num++;


            // 4방향이 모두막혔다면 게임은 끝나야한다.
            while (temp != 4) {
                // 범위의 안쪽이면서 하나씩 진행해 나간다. 처음 방향은 오른쪽
                while (x + dx[dir] < N && x + dx[dir] >= 0 && y + dy[dir] < N && y + dy[dir] >= 0 && answerMap[x + dx[dir]][y + dy[dir]] == 0) {
                    // 마지막에 4방향을 확인해줘야하니 여기에 들어왔으면 temp 를 초기화.
                    temp = 0;

                    //하나 전진한 칸을 num++ 하면서 넣어준다.
                    answerMap[x + dx[dir]][y + dy[dir]] = num++;

                    // x 와 y의 값을 이동.
                    x = x + dx[dir];
                    y = y + dy[dir];
                }
                // 한쪽끝에 도달했으면 방향을 틀어준다 오 -> 밑 -> 왼 -> 위 -> 오
                dir = dir + 1 >= 4 ? 0 : dir + 1;

                // 방향을 틀어줬다면 temp를 1더해준다.
                temp += 1;

            }

            // 출력
            System.out.println("#" + i);
            for (int r = 0; r < N; r++) {
                for (int c = 0; c < N; c++) {
                    System.out.printf(answerMap[r][c] + " ");
                }
                System.out.println();
            }
        }
    }
}

기억에 남길 것!

  • 확실한 풀이방법을 빠르게 결정하자.
© 2020 JunhoBaik, Built with Gatsby