ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 삼각 달팽이 Java 풀이
    문제풀이/프로그래머스 2021. 11. 12. 00:35
    반응형

    이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.

    틀리거나 잘못된 정보가 있을 수 있습니다.

    댓글로 알려주시면 수정하도록 하겠습니다.


    1. 문제

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

    2. 입력

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

    3. 예제

    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]

    4. 풀이

    위 그림처럼 삼각 달팽이 배열을 채우기 위해서 반복을 진행하면 방향이 바뀔 때마다 채워야 하는 수의 개수가 1개씩 줄어들게 됩니다.

     

    그러다 최종적으로 채워야 하는 수의 개수가 1개가 되면 삼각 달팽이 배열은 모두 채워지게 됩니다.

     

    채워지는 방향은 총 3가지 종류로 움직이게 됩니다.

    • 위에서 아래로
    • 왼쪽에서 오른쪽으로
    • 11시 방향 대각선으로

    결국 삼각 달팽이 배열을 채우기 위해서는 3종류의 방향으로 반복을 진행하면서 배열을 채워 나가다 채워야 하는 수의 개수가 1개이면 채우기를 종료하면 됩니다.

     

    int[][] arr = new int[n][n];
    int x = 0, y = -1, p = n, num = 1;

    가장 먼저 삼각 달팽이를 만들기 위한 2차원 배열을 입력으로 주어진 n크기만큼 만들어 주고 시작점인 x, y 값을 초기화하고 채워야 하는 수의 개수를 가지는 p와 현재 수 num을 초기화합니다.

     

    이때 y의 경우 위에서 아래로 이동하는 반복문을 쉽게 이용하기 위해 0이 아닌 -1로 초기화합니다.

     

    무한 반복을 통해 채워야 하는 수의 개수를 가지는 p의 값이 0이 될 때까지 3가지 방향으로 수를 채워 나갑니다.

     

    for(int i=0; i<p; i++)
    	arr[++y][x] = num++;

    위 코드는 위쪽에서 아래쪽으로 채워나가는 것으로 2차원 배열의 y값을 p만큼 반복 1씩 증가하면서 숫자를 채워나갑니다.

     

    for(int i=0; i<p; i++)
    	arr[y][++x] = num++;

    위 코드는 왼쪽에서 오른쪽으로 채워나가는 것으로 2차원 배열의 x값을 p만큼 반복 1씩 증가하면서 숫자를 채워나갑니다.

     

    for(int i=0; i<p; i++)
    	arr[--y][--x] = num++;

    위 코드는 11시 방향 대각선으로 채워나가는 것으로 2차원 배열의 x값과 y값을 p만큼 반복 1씩 감소하면서 숫자를 채워나갑니다.

     

    if(--p == 0) break;

    그리고 방향의 전환 시마다 전치 연산 뒤 p의 값이 0인지 확인 후 0이면 while 반복문을 종료하는 과정을 추가합니다.

     

    List<Integer> list = new ArrayList<>();
    for(int i=0; i<n; i++){
    	for(int j=0; j<i+1; j++)
    		list.add(arr[i][j]);
    }
    
    return list.stream().mapToInt(Integer::intValue).toArray();

    이후 List에 완성된 삼각 달팽이 배열을 순회하면서 값을 담은뒤 배열로 만들어 반환 합니다.

     

    5. 코드

    전체 코드는 Git에 있습니다.

    int[][] arr = new int[n][n];
    int x = 0, y = -1, p = n, num = 1;
    
    while(true){
    	for(int i=0; i<p; i++)
    		arr[++y][x] = num++;
    
    	if(--p == 0) break;
    
    	for(int i=0; i<p; i++)
    		arr[y][++x] = num++;
    
    	if(--p == 0) break;
    
    	for(int i=0; i<p; i++)
    		arr[--y][--x] = num++;
    
    	if(--p == 0) break;
    }
    
    List<Integer> list = new ArrayList<>();
    for(int i=0; i<n; i++){
    	for(int j=0; j<i+1; j++)
    		list.add(arr[i][j]);
    }
    
    return list.stream().mapToInt(Integer::intValue).toArray();
    반응형

    댓글

Designed by Tistory.