
내가 생각했을때 문제에서 원하는부분
양의 정수 n이 매개변수로 주어집니다.
n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.
내가 이 문제를 보고 생각해본 부분
answer라는 정수형 2차원 배열을 크기 n×n으로 생성한다.
숫자를 채울 변수 num을 1로 초기화한다.
네 개의 경계 변수 top, bottom, left, right는 각각 행과 열의 시작과 끝 인덱스를 나타낸다.
while 반복문 내에서 숫자 num이 n2보다 작거나 같을 때까지 네 방향으로 숫자를 채운다.
왼쪽에서 오른쪽으로 이동:
top 행의 left부터 right까지 순차적으로 숫자를 할당하고, 숫자 num을 증가시킨다.
채운 후 top을 1 증가시켜 윗 행 경계를 아래로 이동시킨다.
위에서 아래로 이동:
right 열의 top부터 bottom까지 숫자를 채운다.
채운 후 right를 1 감소시켜 오른쪽 경계를 왼쪽으로 좁힌다.
오른쪽에서 왼쪽으로 이동:
bottom 행의 right부터 left까지 숫자를 채운다.
채운 후 bottom을 1 감소시켜 아래 경계를 위쪽으로 올린다.
아래에서 위로 이동:
left 열의 bottom부터 top까지 숫자를 채운다.
채운 후 left를 1 증가시켜 왼쪽 경계를 오른쪽으로 이동시킨다.
이 과정을 반복하면 테두리부터 안쪽으로 점차 나선 모양으로 숫자가 채워진다.
최종적으로 숫자가 모두 채워진 answer 2차원 배열을 반환한다.
코드로 구현
class Solution {
public int[][] solution(int n) {
int[][] answer = new int[n][n];
int num = 1;
int top = 0;
int bottom = n - 1;
int left = 0;
int right = n - 1;
while (num <= n * n) {
for (int col = left; col <= right && num <= n*n; col++) {
answer[top][col] = num++;
}
top++;
for (int row = top; row <= bottom && num <= n*n; row++) {
answer[row][right] = num++;
}
right--;
for (int col = right; col >= left && num <= n*n; col--) {
answer[bottom][col] = num++;
}
bottom--;
for (int row = bottom; row >= top && num <= n*n; row--) {
answer[row][left] = num++;
}
left++;
}
return answer;
}
}
프로그래머스 코드
package programmers.programmers2;
import java.util.Arrays;
// 프로그래머스 정수를 나선형으로 배치하기
public class Main113 {
public static void main(String[] args) {
int n = 4; // 여기서 배열 크기 설정 가능
Solution solution = new Solution();
int[][] result = solution.solution(n);
// 결과 출력: 2차원 배열 형태로 보기 좋게 출력
for (int[] row : result) {
System.out.println(Arrays.toString(row));
}
}
// 정수를 나선형으로 배치하는 Solution 클래스
static class Solution {
public int[][] solution(int n) {
int[][] answer = new int[n][n];
int num = 1;
int top = 0;
int bottom = n - 1;
int left = 0;
int right = n - 1;
while (num <= n * n) {
// 왼쪽에서 오른쪽
for (int col = left; col <= right && num <= n * n; col++) {
answer[top][col] = num++;
}
top++;
// 위에서 아래로
for (int row = top; row <= bottom && num <= n * n; row++) {
answer[row][right] = num++;
}
right--;
// 오른쪽에서 왼쪽으로
for (int col = right; col >= left && num <= n * n; col--) {
answer[bottom][col] = num++;
}
bottom--;
// 아래에서 위로
for (int row = bottom; row >= top && num <= n * n; row--) {
answer[row][left] = num++;
}
left++;
}
return answer;
}
}
}
위에 있는 코드를 변경한 코드
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.