본문 바로가기
Algorithm

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

by brother_stone 2023. 11. 4.

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

 

프로그래머스

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

programmers.co.kr

 

정답 코드

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

 

문제 해결에 필요한 아이디어

  1. 삼각형을 이차원 배열에 매핑 시키는 것
  2. 반시계 방향으로 순환 시 ⬇️, ➡, ↖️ 패턴이 반복된다는 사실 인지 + 한 방향으로의 이동이 끝나면 다음 방향의 이동 칸수는 직전 이동 칸수 -1 즉, \( n, n-1, n-2, ...\) 꼴이 된다.
  3. n이 주어졌을 때 정답으로 반환할 배열의 칸수는 삼각형 칸 수이다. 이를 구하는 것은 \(1+...+n\)인데 이를 이용해 등차수열의 합 공식 \( S_n = \frac{n(a+l)}{2}\)을 이용해 구한다.
  4. 이동 방향의 패턴이 세가지이므로 mod연산자를 이용해 루프를 돌 때마다 다른 방향의 패턴을 적용한다. \( i%3==0,1,2\)