코딩테스트/프로그래머스

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

플래시🦥 2023. 8. 9.
반응형

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

 

프로그래머스

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

programmers.co.kr

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

제한사항
1 ≤ n ≤ 30


배열에 배치되어지는 정수 idx가 n*n의 크기가 될 때까지 나선형으로 배치하기 위해서 while문을 만들어 준다. 

 

여기 안에 우,하,좌,상의 방향으로 이동하며 배열에 값을 넣어주는 코드를 작성하면 된다. 

 

그러기 위해서는 기준이 되어주는 rStart, cStart,rEnd, cEnd가 필요하다. 각각 이동할 때 행과 열의 시작과 끝까지의 범위를 지정해 준다. 

 

1. 우로 이동할 때는 행의 값은 그대로 이고 열의 값만 증가한다. 그리고 행의 값은 행의 시작값이다. for문이 완료되면 다음 우로 이동하며 배치하기를 위해서는 rStart의 값을 증가시켜 준다. 

2. 하로 이동할 때는 열의 값은 그대로 이고 행의 값만 증가한다. 그리고 열의 값은 열의 끝 값이다. for문이 완료되면 다음 하로 이동하기 위해 cEnd의 값을 감소시켜 준다. 

3. 좌로 이동할 때는 우로 이동할때와 마찬가지로 행은 그대로이고 열의 값만 감소한다. 그리고 행의 값은 행의 끝값이다. for문이 완료되면 다음 좌로 이동을 위해 rEnd의 값은 감소시켜 준다. 

4. 상으로 이동할 때는 하로 이동할때와 마찬가지로 열은 그대로이고 행만 감소한다. 그리고 열의 값은 열의 시작값이다. for문이 완료되면 다음 상으로 이동을 위해 cStart의 값을 증가시켜 준다. 

 

 

전체코드

class Solution {
    public int[][] solution(int n) {
        int[][] ans = new int[n][n];
        int idx=1;
        int rStart=0,cStart=0;
        int rEnd=n-1,cEnd=n-1;
        
        while(idx<=n*n){
            //→
            for(int i = cStart;i<=cEnd;i++) ans[rStart][i]=idx++;
            rStart++;
            //↓
            for(int i = rStart;i<=rEnd;i++) ans[i][cEnd]=idx++;
            cEnd--;
            //←
            for(int i = cEnd;i>=cStart;i--) ans[rEnd][i]=idx++;
            rEnd--;
            //↑
            for(int i = rEnd;i>=rStart;i--) ans[i][cStart]=idx++;
            cStart++;
            
        }
        
        return ans;
    }
}
728x90
반응형

댓글