본문 바로가기

코딩테스트/programmers

삼각 달팽이

https://school.programmers.co.kr/learn/courses/30/lessons/68645

 

프로그래머스

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

programmers.co.kr

 

반시계방향으로 달팽이 채우기를 진행해야 한다.

 

2차원배열을 이용했는데, 1열에 1칸, 2열에 2칸, n열에 n칸으로 계산을 하면 복잡할거 같아서, n * n 의 배열을 염두에 뒀다.

 

class Solution {
	// 진행 방향
    // 벽(?)에 부딫힐때마다 방향을 전환하며, 총 3가지 방향으로 진행된다.
    int[] dx = {1, 0, -1};
    int[] dy = {0, 1, -1};
    
    public int[] solution(int n) {
        
        // 방문 여부 체크
        boolean[][] checked = new boolean[n+1][n+1];
        // 숫자 기록용
        int[][] boxes = new int[n+1][n+1];
        
        // 박스에 넣을 숫자
        int num = 1;
        
        // 1, 1은 일단 숫자 넣어놓고 시작
        boxes[1][1] = num++;
        checked[1][1] = true;
        
        // box 좌표
        int[] pos = new int[] {1, 1};
        // 진행 방향
        int vector = 0;
        // n 값에 따른 숫자 젤 큰 값(등차수열 합)
        int last = n * (1 + n) / 2;
        
        while (num <= last) {
            
            if (vector > 2) vector -= 3;
            
            int x = pos[0] + dx[vector];
            int y = pos[1] + dy[vector];
            
            if (x > n || y > n) {
            	// x, y가 범위를 벗어났을때
                vector++;
                continue;
            } else if (x < 1 || y < 1) {
            	// x, y가 1보다 작을 때
                vector++;
                continue;
            } else if (checked[x][y]) {
            	// 이미 방문한 좌표
                vector++;
                continue;
            }
            
            pos = new int[] {x, y};
            
            checked[pos[0]][pos[1]] = true;
            boxes[pos[0]][pos[1]] = num++;
            
        }
        
        int[] answer = new int[last];
        int idx = 0;
        
        // 박스에 새겨넣은 숫자를 순서대로 꺼냄
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (checked[i][j]) {
                    answer[idx++] = boxes[i][j];
                }
            }
        }
        
        
        return answer;
    }
    
    
}

 

 

'코딩테스트 > programmers' 카테고리의 다른 글

n진수 게임  (0) 2023.09.19
전력망을 둘로 나누기  (0) 2023.09.19
영어 끝말잇기  (0) 2023.09.18
카펫  (0) 2023.09.18
짝지어 제거하기  (0) 2023.09.18