프로그래머스 코딩테스트_도서실습

[코딩테스트_도서실습] 문자열 - 삼각달팽이 - Lv2

러쉬봠 2023. 7. 8. 18:38

문제 설명

정수 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]

나의 풀이

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

다른사람 풀이 - 1

// 프로그래머스 삼각 달팽이 문제
class Solution {
    public int[] solution(int n) {
        int max = n * (n + 1) / 2;
        int[][] matrix = new int[n][n];
        int[] answer = new int[max];

        // 시작 지점 초기화
        int x = 0, y = 0;
        int value = 1;
        matrix[0][0] = 1;

        while (value < max) {
            // 왼쪽 - 위에서 아래로
            while (x + 1 < n && matrix[x + 1][y] == 0) {
                matrix[++x][y] = ++value;
            }

            // 아래 - 왼쪽에서 오른쪽으로
            while (y + 1 < n && matrix[x][y + 1] == 0) {
                matrix[x][++y] = ++value;
            }

            // 오른쪽 아래에서 대각선 위로
            while (y - 1 > 0 && x - 1 > 0 && matrix[x - 1][y - 1] == 0) {
                matrix[--x][--y] = ++value;
            }
        }
        int idx = 0;
        for(int i = 0; i < matrix.length; i++) {
            for (int j = 0; j <= i; j++) {
                answer[idx] = matrix[i][j];
                idx++;
            }
        }
        return answer;
    }
}

다른사람 풀이 - 2

class Solution {
    public int[] solution(int n) {
        int[] answer = new int[n*(n+1) / 2]; // 삼각형의 크기 ( 1 ~ n 까지 합)
		int[][] tri = new int[n][n];
		
		int x = -1; // x 좌표
		int y = 0; // y 좌표
		int num = 1; // 달팽이 채우기 값
		
		for(int i = 0; i < n; i++) {
			for(int j = i; j < n; j++) {
				if(i % 3 == 0) { // 대각선 아래
					x++;
				}
				else if(i % 3 == 1) { // 가로
					y++;
				}
				else if(i % 3 == 2) { // 대각선 위
					x--;
					y--;
				}
				tri[x][y] = num++;
			}
		}
		
		int index = 0;
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < n; j++) {
				if(tri[i][j] == 0) break;
				answer[index++] = tri[i][j];
			}
		}
        
        return answer;
    }
}

출처 : https://wellbell.tistory.com/201

출처 : https://hyojun.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%82%BC%EA%B0%81-%EB%8B%AC%ED%8C%BD%EC%9D%B4-Java

출처 : https://minhamina.tistory.com/58