[프로그래머스(Programmers)][자바(java)] (Lv2) 삼각 달팽이 <월간 코드 챌린지 시즌1>

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

 

 

문제 설명

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

제한사항

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

 

입출력 예

n result
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]

입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 문제 예시와 같습니다.

입출력 예 #3

  • 문제 예시와 같습니다.

 

 

문제 풀이

채워야 하는 숫자는 1부터 (n*(n+1)/2) 까지 이다.

채우는 방향은 하, 우, 상 이 반복된다.

하 :  x 좌표 증가, y 좌표 그대로

우 :  y 좌표 증가, x 좌표 그대로

상 :  x 좌표 감소, y 좌표 감소

n*n 크기의 2차원 배열을 생성한 후 x, y 좌표를 증감해가며 숫자를 채운다.

만약 n이 5라면, 1~15 까지 이며

1~5 (5개) 하 -> 6~9 (4개) 우 -> 10~12 (3개) 상 -> 13~14 (2개) 하 -> 15 (1개) 우  과정으로 채우게 된다.

이중 loop를 돌려 mod 연산을 이용하여 하, 우, 상을 반복하며 숫자를 채운다

결과를 반환할 1차원 배열에 2차원 배열의 숫자를 순서대로 넣는다

 

class Solution {
    public int[] solution(int n) {
        int num_max = n*(n+1)/2, num = 1, i, j, x = -1, y = 0, idx = 0;
        int a[][] = new int[n][n];
        int ans[] = new int[num_max];
        for( i = 0; i < n; i++ ) {
        	for( j = 0; j < n-i; j++ ) {
        		if( i % 3 == 0 ) x++;
        		if( i % 3 == 1 ) y++;
        		if( i % 3 == 2 ) { x--; y--; }
        		a[x][y] = num++;
        	}
        }
        for( i = 0; i < n; i++ )
        	for( j = 0; j < i+1; j++ )
        		ans[idx++] = a[i][j];
        return ans;
    }
}

 

 

반응형