[Programmers] 삼각 달팽이

JaeungE·2021년 7월 12일
0

PS

목록 보기
22/22
post-thumbnail

문제 출처 : [Programmers] 삼각 달팽이, https://programmers.co.kr/learn/courses/30/lessons/68645

👨‍🏫문제

정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.


제한 사항

  • n은 1 이상 1,000 이하입니다.

예제 입/출력

nresult
4[1,2,9,3,10,8,4,5,6,7]
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]

💻코드

import java.util.ArrayList;

class Solution {
    public int[] solution(int n) {
    
        // 달팽이 구조를 2차원 배열 형태로 저장
        int[][] snail = new int[n][n];
        ArrayList<Integer> list = new ArrayList<>();
        int x = 0, y = -1, num = 0;
        
        
        /*
         * 삼각 달팽이 모양으로 값을 추가할 때, 방향은 2차원 배열 [0,0]을 기준으로
         * 아래 -> 오른쪽 -> 좌상단 순서로 n회 만큼 반복되고, 각 방향마다
         * n부터 시작하여 1씩 감소하는 형태(n = 4 -> 아래 4 오른쪽 3 좌상단 2 아래 1)이다.
         */
        for(int i = 1; i <= n; i++){
            for(int j = i; j <= n; j++){
                if(i % 3 == 1){
                    y++;
                }else if(i % 3 == 2){
                    x++;
                }else{
                    y--;
                    x--;
                }
                
                snail[y][x] = ++num;
            }
        }
        
        // 2차원 배열을 순회하며 0이 아닌 값을 list에 저장한다.
        for(int i = 0; i < snail.length; i++){
            for(int j = 0; j < snail[0].length; j++){
                if(snail[i][j] != 0){
                    list.add(snail[i][j]);
                }else{
                    break;
                }
            }
        }
        
        int[] answer = new int[list.size()];
        
        for(int i = 0; i < list.size(); i++){
            answer[i] = list.get(i);
        }
        
        return answer;
    }
}

💡후기

오랜만에 난적을 만났다.

보자마자 수학 문제인가 싶어서 규칙을 찾으려고 머리를 이리저리 굴려보다가, 결국 2차원 배열을 이용해서 풀어야겠다고 생각을 한 시점이 문제를 전부 읽고 40분이나 지난 후였다.....😥

풀고 보니 문제 그대로 코드로 옮기기만 하면 되는 구현 문제였는데, 최대한 효율적이고 간결하게 풀려고 하려니까 혼자서 문제를 너무 어렵게 생각한 것 같다 ㅎㅎ..

의외로 생각을 그대로 옮겨적는 방식이 효율적일 때도 있으니, 처음부터 너무 어렵게 생각하려고 하지 말고 단순하게 접근해보는 방법도 있다는 걸 깨닫게 되는 문제였다!😊

0개의 댓글