프로그래머스 | 삼각 달팽이 (Java)

mul·2023년 7월 4일
0

코딩테스트연습

목록 보기
44/56

🔒 문제

프로그래머스 Lv.2 월간 코드 챌린지 시즌1 삼각 달팽이

🔑 해결

정수 n이 매개변수로 주어질 때, 밑변의 길이와 높이가 n인 삼각형을 맨 위 꼭지점에서 반시계 방향으로 달팽이 채우기를 진행한 뒤에, 첫 행부터 마지막 행까지 순서대로 합친 배열을 return하는 solution 함수를 작성하는 문제이다.

삼각형에서 반시계 방향으로 진행하기 때문에 왼쪽에서 down, 밑변에서 right, 오른쪽에서 up하는 3가지 진행방향이 있고, 이를 순서대로 진행한다.

진행방향이 바뀐 횟수를 i라 한다면, 해당 진행 방향으로 n-i번 진행하는 것을 찾았다. (횟수가 0일 때는 예외로 n-1번 진행한다.)

찾아낸 규칙에 맞게 for문을 설정하여 문제를 해결하였다.
1. idx(현재 위치한 인덱스 값), dis(이동거리), num(배열에 저장할 값)을 각각 0, 1, 1로 초기화
2. down, right, up 각각 진행 방향에 대한 조건문
2-1. 횟수가 0일 경우, 배열의 0번째에 num을 저장. num은 값을 저장하였다면 계속 +1. 이후의 반복문은 down과 동일하지만 n-1번 진행하도록 하였다.
2-2. right의 경우, 현재 인덱스와 이동할 인덱스와의 거리가 +1이므로 idx값을 1씩 증가하면서 num값을 저장.
2-3. up의 경우, 현재 인덱스와 이동할 인덱스와의 거리가 이전에 이동한 거리보다 -1씩 작아지므로, dis--하며 idx에서 dis값을 빼준다.
2-4. down의 경우, 현재 인덱스와 이동할 인덱스와의 거리가 이전에 이동한 거리보다 +1씩 커지므로, dis++하며 idx에서 dis값을 더한다.

🔓 코드

class Solution {
    public int[] solution(int n) {
        int[] answer = {};

        int[] snail = new int[(1+n) * n / 2];
        
        int idx = 0;
        int dis = 1;
        int num = 1;
        for (int i = 0; i < n; i++) {
			if (i == 0) {
				snail[0] = num++;
				for (int j = 0; j < n-1; j++) {
					idx = idx + dis++;
					snail[idx] = num++;
				}
			} else if (i % 3 == 1) {
				for (int j = 0; j < n-i; j++) {
					idx++;
					snail[idx] = num++;
				}
			} else if (i % 3 == 2) {
				for (int j = 0; j < n-i; j++) {
					idx = idx - dis--;
					snail[idx] = num++;
				}
			} else {
				for (int j = 0; j < n - i; j++) {
					idx = idx + dis++;
					snail[idx] = num++;					
				}
			}
		}
        
        answer = snail;
        
        return answer;
    }
}

0개의 댓글