문제 설명
양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.
제한사항
- 1 ≤ n ≤ 30
입출력 예
n result
4 | [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]] |
5 | [[1, 2, 3, 4, 5], [16, 17, 18, 19, 6], [15, 24, 25, 20, 7], [14, 23, 22, 21, 8], [13, 12, 11, 10, 9]] |
입출력 예 설명
입출력 예 #1
- 예제 1번의 n의 값은 4로 4 × 4 배열에 다음과 같이 1부터 16까지 숫자를 채울 수 있습니다.행 \ 열 0 1 2 3
0 1 2 3 4 1 12 13 14 5 2 11 16 15 6 3 10 9 8 7
입출력 예 #2
- 예제 2번의 n의 값은 5로 5 × 5 배열에 다음과 같이 1부터 25까지 숫자를 채울 수 있습니다.행 \ 열 0 1 2 3 4
0 1 2 3 4 5 1 16 17 18 19 6 2 15 24 25 20 7 3 14 23 22 21 8 4 13 12 11 10 9
문제 풀이먼저 어떻게 하면 나선형으로 배치할 수 있을지에 대해 생각해보았다….- for문으로 1부터 n까지 1행 채우기
- for문으로 2부터 n까지 1열 채우기
- for문으로 n-1부터 1까지 1행 채우기
- for문으로 n-1부터 2까지 1열 채우기
- n을 n-2로 설정하고 n=1될 때까지 1~4 반복
- 아이디어
이 아이디어를 토대로 한번 코드로 구현해봐야겠다!
첫번째 시도
class Solution {
public int[][] solution(int n) {
int[][] answer = new int[n][n];
int a = 1;
int count = 1;
int total = n;
while (n >= 1) {
// 왼쪽에서 오른쪽으로 채우기 (최상단)
for (int i=a;i<=n;i++) {
answer[a-1][i-1] = count;
count += 1;
}
// 위에서 아래로 채우기 (오른쪽)
for (int i=a+1;i<=n;i++) {
answer[i-1][n-1] = count;
count += 1;
}
// 오른쪽에서 왼쪽으로 채우기 (최하단)
for (int i=n-1;i>=a;i--) {
answer[n-1][i-1] = count;
count += 1;
}
// 아래에서 위로 채우기 (왼쪽)
for (int i=n-1;i>=a+1;i--) {
answer[i-1][a-1] = count;
count += 1;
}
n -= 2;
a += 1;
}
if (n ==1) //n이 홀수로 주어지는 경우만 해당
answer[total/2][total/2] = count;
return answer;
}
}
뭔가 마지막 부분에서 문제가 있다.
아!!!!! n을 2씩 감소시키는게 아니라 1씩 감소시켜도 된다
그래서 그 부분만 수정해주었다.
두번째 시도
class Solution {
public int[][] solution(int n) {
int[][] answer = new int[n][n];
int a = 1;
int count = 1;
int total = n;
while (n >= 1) {
// 왼쪽에서 오른쪽으로 채우기 (최상단)
for (int i=a;i<=n;i++) {
answer[a-1][i-1] = count;
count += 1;
}
// 위에서 아래로 채우기 (오른쪽)
for (int i=a+1;i<=n;i++) {
answer[i-1][n-1] = count;
count += 1;
}
// 오른쪽에서 왼쪽으로 채우기 (최하단)
for (int i=n-1;i>=a;i--) {
answer[n-1][i-1] = count;
count += 1;
}
// 아래에서 위로 채우기 (왼쪽)
for (int i=n-1;i>=a+1;i--) {
answer[i-1][a-1] = count;
count += 1;
}
n -= 1;
a += 1;
}
if (n ==1) //n이 홀수로 주어지는 경우만 해당
answer[total/2][total/2] = count;
return answer;
}
}
+1
성공!
java가 너무 서툴러서 아직 코드의 가독성이나 간결함은 바라지도 않는다.
일단 돌아가는 거에 만족해야지…
'코딩테스트 > 프로그래머스(JAVA)' 카테고리의 다른 글
[프로그래머스][JAVA]Lv0.중복된 숫자 개수 (0) | 2024.03.09 |
---|---|
[프로그래머스][JAVA]Lv0.배열의 평균 (0) | 2024.03.09 |
[프로그래머스] [Java] Lv0. 짝수의 합 (0) | 2024.03.07 |
[프로그래머스] [JAVA] Lv0. 각도기 (0) | 2024.03.07 |
[프로그래머스] Lv0. 두 수의 나눗셈 (0) | 2024.03.04 |