프로그래머스 - 삼각달팽이

greenTea·2023년 5월 19일
0

코드

 class Solution {

        int[][] answer;
        int x = 0;
        int y = 0;
        int num = 2;
        int floor;

        public int[] solution(int n) {
            answer = new int[n][n];
            answer[0][0]=1;
            floor = n;
            int sum = IntStream.rangeClosed(1, n).sum();

            while (num <= sum) {
                moveDown();
                moveRight();
                moveUp();
            }

            return Arrays.stream(answer)
                    .flatMapToInt(Arrays::stream)
                    .filter(i -> i != 0)
                    .toArray();
        }

        public void moveDown() {

            int next = y + 1;
            if (next >= floor || answer[next][x] != 0) {
                return;
            }
            y = next;
            answer[y][x] = num++;

            moveDown();
        }

        public void moveRight() {

            int next = x + 1;
            if (next >= floor || answer[y][next] != 0) {
                return;
            }
            x = next;
            answer[y][x] = num++;

            moveRight();
        }

        public void moveUp() {

            int nextX = x - 1;
            int nextY = y - 1;
            if (nextX < 0 || nextX >= floor || nextY < 0 || nextY >= floor || answer[nextY][nextX] != 0) {
                return;
            }
            x = nextX;
            y = nextY;

            answer[nextY][nextX] = num++;
            moveUp();

        }

    }

해설

이차원 배열을 선언한다. 이 때 move를 어떻게 하냐에 따라 처리하는 로직을 달리해준다.

  1. 회전하면서 돌기 위해 while문으로 move를 해준다. 이 때 순서를 맞춰서 해줘야 한다. down -> right -> up
  2. 이미 지나갔거나 범위가 넘어가지는 않는지를 확인해준다 넘어가기전에 멈추게 해준다.
  3. 위 과정을 반복한다.

사실 처음에는 감이 잡히지 않았다. 수학적으로 풀려다 보니 시간이 많이 걸렸다. 결국 힌트를 보았는데 2차원 배열을 보자마자 위 아이디어가 떠올랐다. 아직 갈길이 멀다.😭

출처 프로그래머스 - 삼각달팽이

profile
greenTea입니다.

0개의 댓글