마이의 개발 블로그

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

코딩테스트/프로그래머스

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

개발자마이 2023. 6. 3. 18:48
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

접근 방식

 n * n 크기 이차원 배열의 (0, 0)에서 시작하여 아래, 오른쪽, 위쪽(왼쪽 대각선 위)의 세 가지 방향으로 번갈아가며 숫자를 순차적으로 입력하면 되는 문제이다. 두 가지 방식의 답안을 기록으로 남기고자 하는데, 2번은 내가 구현으로 풀어낸 예제이고 1번은 답안 제출 후 발견한 다른 사람의 접근방법을 한 번 본 후에 다시 적어본 코드이다. 프로그래머스에서 제시한 풀이방식도 따로 있기는 한데 2번 방식을 좌표변환 배열을 활용하여 while문 한 개로 간결하게 만든 버전이고 딱히 직관적이거나 시간을 투자할만한 가치가 있는지는 잘 모르겠어서 기록하지는 않았다. 1번과 2번 풀이 사이에는 기억해야할 차이점 한 가지가 있다. 각 방향마다 저장해야하는 숫자의 개수를 알 수 있다는 점을 활용하여 종료조건을 매번 체크할 필요 없이 필요한만큼만 방향전환 하며 동작하도록 만들었다는 점이다(아래로 n개, 우측으로 n-1개, 위로 n-2개... 마지막 1개). 이 점을 고려하여 1번 풀이의 로직을 풀어서 설명하려고 한다.

로직 설명

- n * n 크기의 이차원 배열 arr 선언

- x, y 좌표 선언: 첫 동작을 포함시켜야 하므로 (0, -1)에서 시작, 숫자 변수 num 선언

- 이중 for문 선언 (i = 0일 때 n번 동작, i = 1일 때 n-1번 동작..):

 1) i % 3 으로 방향 결정 (0: 아래, 1: 오른쪽, 2: 위쪽)

 2) arr[x][y]에 num 저장 후 num 증가

- 답변배열 생성 후(배열크기: 최종 num - 1) 0을 제외한 숫자 저장하기

Note

- 이것저것 생각하면서 스쳐지나갔던 로직이였는데 이렇게 쉽게 풀어내기 못한 게 너무 아쉽다.

정답코드  1 (내가 생각하는 모범 답안)

class Solution {
    public int[] solution(int n) {
        int[][] arr = new int[n][n];
        int x = 0, y = -1, num = 1;
        
        for(int i = 0; i < n; i++){
            for(int j = i; j < n; j++){
                switch(i % 3){
                    case 0:
                        y++;
                        break;
                    case 1:
                        x++;
                        break;
                    case 2:
                        x--;
                        y--;
                        break;
                }
                arr[x][y] = num++;
            }
        }
        
        int[] answer = new int[num - 1];
        int idx = 0;
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                if(arr[j][i] == 0){
                    break;
                }
                answer[idx++] = arr[j][i];                
            }
        }
        return answer;
    }
}

정답코드  2 (최초 풀이)

class Solution {
    public int[] solution(int n) {
        int[] answer = {};
        
        int[][] arr = new int[n][n];
        
        int sum = 0;
        
        for(int i = 1; i <= n; i++){
            sum += i;
        }
        
        int col = 0, row = 0;
        int num = 1;
        
        while(true){
            //아래로 이동
            while(row != n && arr[col][row] == 0){
                arr[col][row++] = num++;
            }
            
            row--;
            col++;
            
            if(row >= n || col >= n || arr[col][row] != 0){
                break;
            }
            
            //오른쪽으로 이동
            while(col != n && arr[col][row] == 0){
                arr[col++][row] = num++;
            }
            
            col -= 2;
            row--;    
            
            if(row >= n || col >= n || arr[col][row] != 0){
                break;
            }
            
            //위로 이동
            while(col != 0 && row != 0 && arr[col][row] == 0){
                arr[col--][row--] = num++;
            } 
            
            col++;
            row += 2;
            
            if(row >= n || col >= n || arr[col][row] != 0){
                break;
            }
        }
        //답변배열 생성 후 숫자 입력
        answer = new int[sum];
        int index = 0;
        
        for(int i = 0; i < arr.length; i++){
            for(int j = 0; j < arr[0].length; j++){
                if(arr[j][i] == 0){
                    break;
                }
                answer[index++] = arr[j][i];
            }
        }
        
        return answer;
    }
}
반응형
Comments