본문 바로가기

Algorithm/Programers - Java

[프로그래머스(Java)] 정수를 나선형으로 배치하기

 

Level. 0

 

문제

양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.

* 제한사항
- 1 ≤ n ≤ 30

 

풀이

class Solution {
    public int[][] solution(int n) {
        int[][] answer = new int[n][n];
        String vec = "right";        
        int count = 1;
        
        int row = 0, col = 0;
        
        while(count <= n*n){
            
            answer[row][col] = count++;
            if(vec.equals("right")){
                if(col == n-1 || answer[row][col+1] != 0){
                    vec = "down";
                    row += 1;
                }
                else {
                    col += 1;
                }
            }
            else 
            if(vec.equals("down")){
                if(row == n-1 || answer[row+1][col] != 0){
                    vec = "left";
                    col -= 1;
                }
                else {
                    row += 1;
                }
            }
            else
            if(vec.equals("left")){
                if(col == 0 || answer[row][col-1] != 0){
                    vec = "up";
                    row -= 1;
                }
                else {
                    col -= 1;
                }
            }
            else
            if(vec.equals("up")){
                if(row == 0 || answer[row-1][col] != 0){
                    vec = "right";
                    col += 1;
                }
                else {
                    row -= 1;
                }
            }
        }
        
        return answer;
    }
}

vec이라는 문자열을 사용하여 배열의 이동방향을 설정해주었다. 

 

 

 


다른 풀이

class Solution {
    public int[][] solution(int n) {
        int[][] array = new int[n][n];
        int num = 1;
        int rowStart = 0;
        int rowEnd = n - 1;
        int colStart = 0;
        int colEnd = n - 1;

        while (rowStart <= rowEnd && colStart <= colEnd) {
            // 왼쪽에서 오른쪽으로
            for (int i = colStart; i <= colEnd; i++) {
                array[rowStart][i] = num++;
            }
            rowStart++;

            // 위에서 아래로
            for (int i = rowStart; i <= rowEnd; i++) {
                array[i][colEnd] = num++;
            }
            colEnd--;

            // 오른쪽에서 왼쪽으로
            for (int i = colEnd; i >= colStart; i--) {
                array[rowEnd][i] = num++;
            }
            rowEnd--;

            // 아래에서 위로
            for (int i = rowEnd; i >= rowStart; i--) {
                array[i][colStart] = num++;
            }
            colStart++;
        }
        return array;
    }
}

 

열의 시작점과 끝점, 행의 시작점과 끝점을 이동시켜 배열을 만들었다. 

 

 

 


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

 

프로그래머스

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

programmers.co.kr