코딩테스트-알고리즘/프로그래머스

[프로그래머스/Lv.0] 정수를 나선형으로 배치하기

닉네임생각즁 2024. 1. 11. 20:33

 

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

 

프로그래머스

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

programmers.co.kr

class Solution {
    public int[][] solution(int n) {
        int[][] answer = new int[n][n];
        int[][] rule = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        int index = 0; // rule 넘기는 index
        int value = 1; // 1 ~ n^2
        int i = 0; int j = 0;
        
        while(value <= n * n) {
            
            answer[i][j] = value;
            value++;
            
            int test_i = i + rule[index][0]; // 다음 예상되는 i
            int test_j = j + rule[index][1]; // 다음 예상되는 j
            
            if(test_i >= n || test_i < 0 || test_j >= n || test_j < 0 || answer[test_i][test_j] != 0) { 
                // 다음 넘어가기 전에 방향 바꿔야되는지 미리 확인해야함
                index++; // rule 넘어감
                if(index == 4) index = 0; // rule 배열 크기는 4라서 넘어가면 안됨
            } 
            
            // i, j 진짜 바꿔줌
            i = i + rule[index][0];
            j = j + rule[index][1];
            
        }
        
        return answer;
    }
}

 

이게 어떻게 0단계 문제이며,,어떻게 1점밖에 안 주는 문제인거지 😐😐😐

몇달전에 파이썬으로 다른 코테 준비하면서 비슷한 유형을 만났을때(삼성 달팽이 숫자 문제!) 해설 강의 들어서 그나마 접근 방법을 바로 알았던거지 아예 0인 상태였으면 그냥 멘붕왔을 문제다

그때 풀이 들었을때는 돌아가는 규칙을 4개씩 묶어서 만들었던거같은데 정확히 기억이 나지는 않아서 규칙을 만들어봤고

→(행+0, 열+1) ↓(행+1, 열+0) ←(행+0, 열-1) ↑(행-1, 열+0) 이라서

int[][] rule = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; 

이렇게 만들 수 있었다

그리고 answer 배열의 인덱스 범위를 벗어날때와 이미 값이 들어있을때는 방향을 바꿔야하기 때문에 이때는 값을 넣어주지 않고 방향을 바꿔주기만 했다

 

풀면서 실수했던 코드는 아래와 같다

        while(value <= n * n) {
            
            answer[i][j] = value;
            value++;
            
            x = rule[index][0];
            y = rule[index][1];
            i = i + x;
            j = j + y;
            
            if(i >= n || i < 0 || j >= n || j < 0 || answer[i][j] != 0) { // 방향 바꿔야되는 경우
                index++; // rule 넘어감
                if(index == 4) index = 0; // rule 배열 크기는 4라서 넘어가면 안됨
            } 
            
        }

 

이렇게 해주었었는데 이러면 방향 바꿔야되는 상황일때 if문에서  rule이 바뀌긴하는데 i, j는 바뀌기 전 rule에 의해 적용된채로 다시 처음으로 돌아간다 그래서 계속 index 벗어났다고 오류가 났었음

위에서 i, j를 미리 바꿔주지 말고 방향바꿔야되는지 확인 후 바꿔야 정상적으로 돌아갔다

 

 

한번 풀어본 유형은 다음번에 도움이 된다는것을 느낀 문제였다👍