새소식

Algorithm/Programmers

[Java][프로그래머스] 68645번, 삼각 달팽이

  • -
728x90

 

 

프로그래머스

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

programmers.co.kr

 

🔥 난이도 : LEVEL 2

 

 

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

 

 

🔽 문제풀이

이번 문제는 제법 고려할 사항들이 많다. 우선 저 그림을 직각 삼각형으로 바꿔서 생각해보자!

[n=4]
1
2 9
3 10 8
4 5 6 7

[n=5]
1
2 12
3 13 11
4 14 15 10
5 6  7  8  9

 

n 이 4일 때, 왼쪽 상단에서 시작해서 오른쪽 끝, 그리고 다시 대각선을 타고 위로 이동함을 계속 반복한다.

 

왼쪽 Line, 1~4

밑줄 Line, 4~7

대각선 Line 8,9

..

..

 

방향을 바꿔가며 이동하면서 달팽이가 가운데에 도착할 때의 수는 10(4+3+2+1) 임을 알 수 있다. 즉, 반환해야 할 int 배열의 사이즈는 n + (n-1) + ... 1 이다. 이는 등비수열의 합인 n * (n+1) / 2 로도 나타낼 수 있다.

 

이러한 과정을 통했으면 Loop 를 순회하며 

 

1. 왼쪽 라인을 타고 이동

2. 밑의 라인을 타고 이동

3. 대각선 라인을 타고 다시 위로 이동

 

의 과정을 거치는 로직을 설계하면 된다. 이제 코드로 설명해보자

 

int L = IntStream.rangeClosed(1, n).sum();
int[][] matrix = new int[n][n];

int x = 0, y = 0, index = 1;

 

 

우선 값들을 초기화 해줬다. x 좌표와 y 좌표를 통해 matrix 의 값을 채우고 이를 L 만큼 반복하게 설계했다.

 

IntStream.rangeClosed(1, n)
: 1, 2, .. n
IntStream.range(1, n) 
: 1, 2, .. n-1

 

L 을 구하는 방식에 IntStream.rangeClosed() 를 사용했는데 IntStream.range() 와 마지막 수에서 차이가 있다.

 

while (index < L) {
    // 왼쪽 Line
    while (y + 1 < n && matrix[y+1][x] == 0) {
        matrix[++y][x] = ++index;
    }

    // 맨 밑의 Line
    while (x + 1 < n && matrix[y][x+1] == 0) {
        matrix[y][++x] = ++index;
    }

    // 오른쪽 대각선 Line
    while (y > 0 && matrix[y-1][x-1] == 0) {
        matrix[--y][--x] = ++index;
    }
}

return IntStream.range(0, n)
            .flatMap(i -> IntStream.range(0, i + 1)
            .map(j -> matrix[i][j]))
            .toArray();

 

이제 반복문을 통해서 차례대로 왼쪽, 밑줄, 오른쪽 대각선을 통해 위로의 과정을 반복하여 배열을 채워가면 된다.

 

import java.util.stream.*;

class Solution {
    public int[] solution(int n) {
        int L = IntStream.rangeClosed(1, n).sum();
        int[][] matrix = new int[n][n];

        int x = 0, y = 0, index = 1;

        matrix[0][0] = 1;

        while (index < L) {
            // 왼쪽 Line
            while (y + 1 < n && matrix[y+1][x] == 0) {
                matrix[++y][x] = ++index;
            }

            // 맨 밑의 Line
            while (x + 1 < n && matrix[y][x+1] == 0) {
                matrix[y][++x] = ++index;
            }

            // 오른쪽 대각선 Line
            while (y > 0 && matrix[y-1][x-1] == 0) {
                matrix[--y][--x] = ++index;
            }
        }

        return IntStream.range(0, n)
                    .flatMap(i -> IntStream.range(0, i + 1)
                    .map(j -> matrix[i][j]))
                    .toArray();
    }
}
728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.