관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[알고리즘] 프로그래머스 삼각 달팽이 -월간 코드 챌린지 시즌1- 자바 코틀린 본문

알고리즘/일반(단순구현)

[알고리즘] 프로그래머스 삼각 달팽이 -월간 코드 챌린지 시즌1- 자바 코틀린

막무가내막내 2020. 10. 15. 15:22
728x90

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 에 나온 삼각달팽이 문제를 풀어봤습니다. ㅎㅎ

삼각형에서 하단 -> 우측 -> 상단 방향으로 달팽이모양처럼 순서대로 반복해서 값을 넣어주는 문제입니다.

 

1. 먼저 4개의 인덱스 top(상단), left(좌측), bottom(하단), right(우측) 을 세팅합니다.

 

2. 최대크기만큼 value를 채웠다면 break합니다.

 

3. 가장 상단에 있는 가장 짧은 상태입니다. 하단이동 탐색을 합니다. top인덱스 -> bottom인덱스 까지 value 를 넣어줍니다. 다 넣어준 후 해당 top은 다 탐색한게 되므로 top++ 해주고 첫번째 인덱스도 다 탐색한게 되므로 left++ 해줍니다.

 

4. 가장 밑바닥에 있는 가장 긴 상태입니다. 우측이동 탐색을 합니다. left인덱스 -> right 인덱스까지 value를 넣어줍니다. 다 넣어준 후 해당 bottom은 다 탐색한게 되므로 bottom-- 해주고 가장 마지막 right 인덱스도 다 탐색한게 되므로 right-- 해줍니다. 

 

5. 상단 이동 탐색을 합니다. bottom 인덱스 -> top 인덱스까지 value를 넣어줍니다. 다 넣어준 후 가장 상단까지 탐색한 이후이므로 top++ 해주고 가장 큰 right도 탐색한게 되므로 right--를 해줍니다.

 

이것들을 2의 조건이 될때까지 반복합니다.

 

 

풀이는 다음과 같습니다.

 

[Java]

class Solution {
    public static void main(String[] args) {
        Solution solution = new Solution();
        solution.solution(6);
    }

    public int[] solution(int n) {
        int[] answer = {};
        int[][] arr = new int[n][n];
        int max = n * (n + 1) / 2; // 총 개수
        int top = 0; //상단
        int left = 0; //좌측
        int bottom = n - 1; //하단
        int right = n - 1; //우측
        int value = 1;
        while (max >= value) {
            for (int i = top; i <= bottom; i++) { // 하단이동
                if (max < value) break;
                arr[i][left] = value++;
            }
            if (max < value) break;
            top++;
            left++;
            for (int j = left; j <= right; j++) { // 우측이동
                if (max < value) break;
                arr[bottom][j] = value++;
            }
            if (max < value) break;
            bottom--;
            right--;
            int index = right;
            for (int i = bottom; i >= top; i--) { //상단 이동
                if (max < value) {
                    break;
                }
                arr[i][index--] = value++;
            }
            top++;
            right--;
        }
        answer = new int[max];
        int index = 0;
        for (int i=0; i<n; i++){
            for (int j=0; j<=i; j++){
                answer[index++] =  arr[i][j];
            }
        }
        return answer;
    }
}

 

 

[Kotlin]

class Solution {
    fun solution(n: Int): IntArray {
        var answer: IntArray
        val arr = Array(n) { IntArray(n) }
        val max = n * (n + 1) / 2 // 총 개수
        var top = 0 //상단
        var left = 0 //좌측
        var bottom = n - 1 //하단
        var right = n - 1 //우측
        var value = 1
        while (max >= value) {
            for (i in top..bottom) { // 하단이동
                if (max < value) break
                arr[i][left] = value++
            }
            if (max < value) break
            top++
            left++
            for (j in left..right) { // 우측이동
                if (max < value) break
                arr[bottom][j] = value++
            }
            if (max < value) break
            bottom--
            right--
            var index = right
            for (i in bottom downTo top) { //상단 이동
                if (max < value) {
                    break
                }
                arr[i][index--] = value++
            }
            top++
            right--
        }
        answer = IntArray(max)
        var index = 0
        for (i in 0 until n) {
            for (j in 0..i) {
                answer[index++] = arr[i][j]
            }
        }
        return answer
    }
}

 

 

댓글과 공감은 큰 힘이 됩니다. :) 

728x90
Comments