본문 바로가기
코딩테스트/프로그래머스

[프로그래머스/java] 월간 코드 챌린지 시즌1 삼각 달팽이

by drCode 2021. 3. 10.
728x90
반응형

n진수 게임에 이어서 Level 2짜리 문제를 풀었는데

 

제한사항을 잘 보고 풀어야한다는걸 다시 한 번 느끼게 되는 것 같다.

 

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) 제한사항을 보면 1이상으로 명시되어있다. n이 1인 경우도 리턴을 해줘야한다.

(2) 이동방향(dir)은 i와 j값의 영향을 받게 되어있다. 끝에 도달하거나 그 다음 칸이 0이 아니라면 방향을 바꿔줘야 한다.

(3) i와 j값은 방향을 따라간다. ↙방향이면 행을 증가시키고, → 방향이면 행은 감소, 열은 증가시키고, ↖ 방향이면 열을 감소시킨다.

(4) return되는 answer 배열에 값을 넣을 때는 size를 점층적으로 늘려주는 방식으로 한다.

ex) size : 1일때 1층. 1층일 땐 값 한번만 넣어주고 size를 1 증가. size : 2일때 값을 2번 넣어주는 식으로 생각한다.

 

package triangleSnail;

import java.util.Arrays;

public class TriangleSnail {
	public static void main(String[] args) {
		Solution s = new Solution();
		
		System.out.println(Arrays.toString(s.solution(4)));
		System.out.println(Arrays.toString(s.solution(5)));
		System.out.println(Arrays.toString(s.solution(6)));
	}
}

class Solution {
    public int[] solution(int n) {
    	if(n == 1) {
    		int[] arr1 = {1};
    		return arr1;
    	}
        int[][] arr = new int[n][n];
        int num = 0, i = 0, j = 0;
        int dir = 0;	// ↙ : dir == 0, → : dir == 1, ↖ :  dir == 2
        boolean cir = true;
        
        while(cir) {
        	// 값 대입
        	if(arr[i][j] == 0) arr[i][j] = num + 1;
        	else break;
        	
        	// 방향전환
        	if(dir == 0 && (i == n-1 || (i < n-1 && arr[i+1][j] != 0))) {
    			dir++;
        	} else if(dir == 1 && ((i == 0 && j == n-1) || ((i > 0 && j < n) && arr[i-1][j+1] != 0))) {
        		dir++;
        	} else if(dir == 2 && (j == 0 || (j > 0 && arr[i][j-1] != 0))) {
        		dir = 0;
        	}
        	
        	// 칸 이동
        	if(dir == 0) i++;
        	else if(dir == 1) {
        		i--; j++;
        	} else j--;
        	
        	num++;
        }
        
        int[] answer = new int[num];
        int size = 0, idx = 0, originI = 0;
        i = 0; j = 0;
        
        // 1층 -> 값 1개, 2층 -> 값 2개, 3층 -> 값 3개 ... 이런 식으로 생각하기
        while(size < n) {
        	i = originI;
        	for (int k = 0; k <= size; k++) {
        		answer[idx++] = arr[i][j];
        		i--; j++;
        	}
        	size++; j = 0; originI++;
        }
       
        return answer;
    }
}
728x90
반응형

댓글