본문 바로가기
Algorithm/프로그래머스풀이

[알고리즘 문제풀이] 프로그래머스 - 삼각 달팽이 / JAVA(자바)

by 계범 2022. 3. 9.

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

리팩토링 코드

/**
    1. n*n배열 생성(최종 정답 배열은 n*(n+1)/2)
    
    2. 높이 증가하면서 0이거나 배열안이면 +1씩 증가된 숫자 넣기
    
    3. 그다음 가로방향 증가(0이거나 배열안이면)
    
    4. 가로 -1 높이 -1 하면서 움직이기
    
    5. 2~4번 반복하며 진행
**/

class Solution {
    public int[] solution(int n) {
        int[][] map = new int[n][n];
        
        int num = 1;
        int x= -1, y = 0;
        
        for(int i = 0; i < n; i++){
            for(int j = i; j < n; j++){
                if(i % 3 == 0){
                    x++;
                }else if(i % 3 == 1){
                    y++;
                }else{
                    x--;
                    y--;
                }
                
                map[x][y] = num++;
            }
        }
        
        
        int[] answer = new int[n*(n+1)/2];
        int idx = 0;
        
        for(int i = 0; i < n; i++){
            for(int j = 0; j <= i; j++){
                answer[idx++] = map[i][j];
            }
        }
        
        return answer;
    }
}

원래코드

/**
    1. n*n배열 생성
    
    2. 높이 증가하면서 0이거나 배열안이면 +1씩 증가된 숫자 넣기
    
    3. 그다음 가로방향 증가(0이거나 배열안이면)
    
    4. 가로 -1 높이 -1 하면서 움직이기
    
    5. 2~4번 반복하며 진행
**/

class Solution {
    public int[] solution(int n) {
        int[][] map = new int[n][n];
        
        int num = 1;
        int x= 0, y = 0;
        
        // 초기값
        map[x][y] = 1;
        num++;
        
        while(true){
            boolean check = false;
            // 세로 증가
            while(true){
                if(x+1< n && map[x+1][y] == 0){
                    x++;
                    check = true;
                }else{
                    break;
                }
                map[x][y] = num;
                num++;
            }
            
            // 가로 증가
            while(true){
                if(y+1 < n && map[x][y+1] == 0){
                    y++;
                    check = true;
                }else{
                    break;
                }
                map[x][y] = num;
                num++;
            }
            
            //가로 세로 감소
            while(true){
                if(x-1 >= 0 && y-1 >= 0 && map[x-1][y-1] == 0){
                    x--;
                    y--;
                    check = true;
                }else{
                    break;
                }
                map[x][y] = num;
                num++;
            }
            if(check == false) break;
        }
        
        int[] answer = new int[n*(n+1)/2];
        int idx = 0;
        
        for(int i = 0; i < n; i++){
            for(int j = 0; j <= i; j++){
                answer[idx++] = map[i][j];
            }
        }
        
        return answer;
    }
}

댓글