본문 바로가기

코딩테스트/programmers

삼각 달팽이

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

 

프로그래머스

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

programmers.co.kr

 

 

규칙을 찾아서 (x, y) 좌표에 있는 블럭에 적히는 숫자가 무엇인지 공식을 산출해보려 했으나.. 실패했다.

 

그래서 그냥 주어진 문제대로, 반시계 방향으로 숫자를 채워나가는 방식을 사용했다.

 

단지 그림상으론 삼각형 구조의 블럭이지만, 프로그램상 n * n 구조의 배열을 사용 했고, 그림상의 블록들을 모두 왼쪽 정렬해서 진행했다.

 

class Solution {
    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;
        boxes[1][1] = num++;
        checked[1][1] = true;
        
        int[] pos = new int[] {1, 1};
        int vector = 0;
        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 || x < 1 || y > n || 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' 카테고리의 다른 글

두 큐 합 같게 만들기  (0) 2023.11.15
큰 수 만들기  (0) 2023.11.15
소수 찾기  (1) 2023.11.13
다리를 지나는 트럭  (0) 2023.11.09
가장 큰 수  (0) 2023.11.09