[구현] 프로그래머스 삼각 달팽이 (실패분석 - 아이디어)

byeol·2023년 4월 26일
0

접근

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

  • 처음 시도
    1차원 배열에 바로 저장하자

  • 두 번째 시도
    2차원 배열에 직각삼각형으로 저장하자
    규칙을 발견
    아래

    대각선

    이렇게 3개의 규칙이 반복된다는 것을 발견했습니다.
    하지만 어떻게 코드로 구현해야 되는지 감을 잡지 못해서
    30분의 풀이 시간을 초과했습니다.

다른 스터디원의 풀이를 통해서 어떻게 접근해야 하는지 힌트를 얻고
다시 풀어보았습니다.

삼각달팽이의 경우에는
3개의 규칙이 계속 반복됩니다.
이 규칙을 어떻게 표현할 것인가를 알아야 합니다.

int index=1;
int row=-1;
int col=0;
 for(int i=0;i<n;i++){
       for(int j=i;j<n;j++){
              if(i%3==0) row++; // 아래
              if(i%3==1) col++; // 옆
              if(i%3==2){ // 대각선
                    row--;
                    col--;
              }
              answer[row][col]=index++;
                
                
            }
        }

위와 같이 3으로 나눠준 나머지를 계산함으로써
아래, 옆, 대각선에 대한 방향을 정합니다.

그 answer의 2차원 배열을 출력한 결과
테스트 케이스에서 삼각 달팽이를 잘 구현하고 있다는 것을 확인할 수 있었습니다.

풀이

import java.util.*;

class Solution {
    public ArrayList<Integer> solution(int n) {
        int[][] answer = new int[n][n];
        //정수 n
        ArrayList<Integer> list = new ArrayList<>();
        
        // 앞에 수 채우기
        int index=1;
        int row=-1;
        int col=0;
        for(int i=0;i<n;i++){
            for(int j=i;j<n;j++){
                if(i%3==0) row++; // 아래
                if(i%3==1) col++; // 옆
                if(i%3==2){ // 대각선
                    row--;
                    col--;
                }
                answer[row][col]=index++;
                
                
            }
        }
        
        /*
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                System.out.print(answer[i][j]+" ");
            }
            System.out.println();
        }
        */
        
        for(int i=0;i<n;i++){
            for(int j=0;j<=i;j++){
                list.add(answer[i][j]);
            }
        }
        
        
        
        
        return list;
    }
    
    
    
    
}
profile
꾸준하게 Ready, Set, Go!

0개의 댓글