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;
}
}
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 수 조작하기 1 자바 java (0) | 2023.08.11 |
---|---|
[프로그래머스] 코드 처리하기 자바 java (0) | 2023.08.10 |
[프로그래머스] 달리기 경주 자바 java (0) | 2023.08.09 |
[프로그래머스] 문자열 겹쳐쓰기 자바 java (0) | 2023.08.08 |
[프로그래머스] 대소문자 바꿔서 출력하기 자바 java (0) | 2023.08.08 |
댓글