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

leehyunjon·2022년 9월 4일
0

Algorithm

목록 보기
104/162

삼각 달팽이 : https://school.programmers.co.kr/learn/courses/30/lessons/68645


Problem

image

Solve

삼각형이 n길이의 변과 n길이의 높이를 가질때, 상단 꼭짓점 부터 반시계방향으로 돌아 값을 채워넣어야 한다.

해당 문제를 풀때 삼각형이 아니라 왼쪽으로 정렬 시켜 값이 채워진 계단 형으로 생각하고 문제를 풀었다.

2차원 배열에서 [0][0]에서 n만큼 아래 방향으로 값을 채우고, n-1만큼 오른쪽으로 값을 채우고, n-2만큼 왼쪽 대각선으로 값을 채워나가서 n-i이 0이 될 때까지 반복하면 모든 값을 채우게 된다.

그리고 각 index에서 index+1만큼의 값을 순서대로 채워서 반환하면 된다.


Code

class Solution {
	//아래, 오른쪽, 왼쪽 대각선 순차적으로 이동
    static int[] dy = {1,0,-1};
    static int[] dx = {0,1,-1};
    public int[] solution(int n) {
        int[][] triangle = new int[n][n];
		int y = -1;
		int x = 0;
		int d = 0;
		int num = 1;
        
        //특정 방향으로 이동할 칸 수
		for(int t = n;t>0;t--){
        	//이동
			for(int i=0;i<t;i++){
				y = y + dy[d];
				x = x + dx[d];
				triangle[y][x] = num++;
			}
            //해당 방향으로 이동했다면 방향을 바꿔준다.
			d = (d+1)%3;
		}

		//삼각형을 채우기 위해서는 1~limit까지 숫자가 필요하다 (등차수열)
		int limit = ((n*(1+n))/2);
		int[] answer = new int[limit];
		int idx=0;
        //각 index에서 index+1개의 수를 가져와 순차적으로 넣어준다.
		for(int i=0;i<n;i++){
			for(int j=0;j<=i;j++){
				answer[idx++] = triangle[i][j];
			}
		}

		return answer;
    }
}

Result

삼각형을 계단 형식으로 바꿔 생각한게 풀이의 팁인것 같다.


Reference

profile
내 꿈은 좋은 개발자

0개의 댓글