Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Life Engineering

[프로그래머스] 삼각 달팽이 (Java) 본문

Problem Solving

[프로그래머스] 삼각 달팽이 (Java)

흑개 2022. 3. 1. 15:01

https://programmers.co.kr/learn/courses/30/lessons/68645

 

코딩테스트 연습 - 삼각 달팽이

5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9] 6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]

programmers.co.kr

class Solution {
    static int N;
    public int[] solution(int n) {
        int[] answer = new int[n*(n+1)/2];
        int[][] map=new int[n][n];
        int y=0, x=0;
        int num=1;
        N=n;
        while(true){
            if (num>(n*(n+1)/2)) break;
            while (isRange(y,x) && map[y][x]==0){
                map[y][x]=num;
                num++;
                y++;
            }
            y--;
            x++;
            while (isRange(y,x) && map[y][x]==0){
                map[y][x]=num;
                num++;
                x++;
            }
            x-=2;
            y--;
            while (isRange(y,x) && map[y][x]==0){
                map[y][x]=num;
                num++;
                y--;
                x--;
            }
            y+=2;
            x++;
        }
        int cnt=0;
        for (int i=0; i<n; i++){
            for (int j=0; j<i+1; j++){
                answer[cnt++]=map[i][j];
            }
        }
        return answer;
    }
    
    public static boolean isRange(int y, int x){
        return y>=0 && x>=0 && y<N && x<N;
    }
}

-규칙성을 찾는 게 중요한 문제

 

1. 왼쪽 아래로 움직이고

2. 오른쪽으로 움직이고

3. 대각선 방향으로 이동하고

 

이 움직임을 구현한다. 

1,2,3 도는 것을 1 사이클로 할 때, 몇번 사이클로 돌아야 하는지 몰라서 num을 기준으로, n*(n+1)/2 가 되었을 때 반복문을 종료하는 것으로 했다. 

 

근데 이렇게 하면 코드가 복잡하다. 다른 분들의 코드를 보니, 

    for(let i = n; i > 0; i-=3){
        for(let j = 0; j < i ; j++) {numArr[++row][col] = curNum++;}
        for(let j = 0; j < i-1 ; j++) {numArr[row][++col] = curNum++;}
        for(let j = 0; j < i-2 ; j++) {numArr[--row][--col] = curNum++;}
    }

(출처: https://velog.io/@dolarge/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%82%BC%EA%B0%81%EB%8B%AC%ED%8C%BD%EC%9D%B4 님)

3만큼 감소시켜 가면서 돌릴 사이클의 수를 계산할 수 있다.

n=5라면, 5->4->3->2->1 개만큼 각 단계에서 수를 써주기 때문에.. 3을 감소시켜 사이클의 수를 알고, 

각 사이클의 단계에서는 쓸 수를 그 전 단계보다 -1 해가면서 써줄 수 있다.

 

규칙성을 찾는게 중요한 문제!