본문 바로가기

Java/프로그래머스

[JAVA] 프로그래머스 - 정수를 나선형으로 배치하기

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

 

프로그래머스

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

programmers.co.kr

 

 

 

 

 

 

 

 

문제 풀이 

 

[프로그래머스] Lv.0 정수를 나선형으로 배치하기.java (velog.io)

 

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

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges

velog.io

 

- 시계방향 나선형은 오른쪽으로 -> 아래쪽으로 -> 왼쪽으로 -> 위쪽으로 진행 

- for loop 4개를 사용하여 num을 1씩 늘리면서 각 위치에 저장

- 오른쪽으로 -> 아래쪽으로 -> 왼쪽으로 -> 위쪽으로 가 한번 끝나면 각 인덱스 감소 

 

정답 

 

class Solution {
    public int[][] solution(int n) {
        int[][] answer = new int[n][n];
        
        int num =1;
        int rowStart = 0; //행의 시작 인덱스
        int rowEnd = n-1; //행의 끝 인덱스
        int colStart = 0; //열의 시작 인덱스
        int colEnd = n-1; //열의 끝 인덱스 
        
        while(num <=n*n)
        {
            //왼쪽 -> 오른쪽
            for(int i=colStart; i<=colEnd; i++)
            {
                answer[rowStart][i] = num++;
            }
            rowStart++; //행의 시작 인덱스 증가 
            
            //위쪽->아래쪽
            for(int i=rowStart; i<=rowEnd; i++)
            {
                answer[i][colEnd] = num++;
            }
            colEnd--; //열의 끝 인덱스 감소 
            
            //오른쪽 -> 왼쪽
            for(int i=colEnd; i>=colStart; i--)
            {
                answer[rowEnd][i] = num++;
            }
            rowEnd--; //행의 끝 인덱스 감소 
            
            //아래쪽 -> 위쪽
            for(int i=rowEnd; i>=rowStart; i--)
            {
                answer[i][colStart] = num++;
            }
            colStart++; //열의 시작 인덱스 증가 
            
            
        }
        
        return answer;
    }
}

 

 

다른 사람의 풀이 

 

1)

class Solution {
    public int[][] solution(int n) {
        int[][] answer = new int[n][n];
        int num = 1;
        int x = 0, y = 0;
        int dx[] = {0, 1, 0, -1};
        int dy[] = {1, 0, -1, 0};
        int direction = 0;

        while (num <= n * n) {
            answer[x][y] = num++;

            int nx = x + dx[direction]; 
            int ny = y + dy[direction];

            if (nx < 0 || nx >= n || ny < 0 || ny >= n || answer[nx][ny] != 0) {
                direction = (direction + 1) % 4; //범위 밖에 나갔을 때 방향전환
                nx = x + dx[direction];
                ny = y + dy[direction];
            }
            x = nx;
            y = ny;
        }

        return answer;
    }
}

 

 

2)

class Solution {
    public int[][] solution(int n) {
        int[][] answer = new int[n][n];
        int num=1;
        int start=0;
        int end=n;

        while(num <= n*n){

        //->
        for(int j=start;j<end;j++)
            answer[start][j]=num++;
        //v
        for(int i=start+1;i<end;i++)
            answer[i][end-1]=num++;
        //<
        for(int j=end-2;j>=start;j--)
            answer[end-1][j]=num++;
        //^
        for(int i=end-2;i>start;i--)
            answer[i][start]=num++;
        start++;
        end--;

        }

        return answer;
    }
}