https://school.programmers.co.kr/learn/courses/30/lessons/181832
문제
양의 정수 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
따라서 [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]를 return 합니다.
입출력 예 #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
따라서 [[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]]를 return 합니다.
풀이
class Solution {
private val dir = arrayOf(
arrayOf(0, 1),
arrayOf(1, 0),
arrayOf(0, -1),
arrayOf(-1, 0),
)
fun solution(n: Int): Array<IntArray> {
val arr = Array(n) { IntArray(n) }
var cnt = -1
var direction = 0
var i = 0
var j = 0
var depth = 1
var move = n - 1
while (move != 0) {
repeat(2 - cnt) {
repeat(move) {
arr[i][j] = depth++
i += dir[direction][0]
j += dir[direction][1]
}
direction = (direction + 1) % 4
}
move--
cnt = 0
}
arr[i][j] = depth
return arr
}
}
- 해당문제에서는 1씩증가 값을 배열에 특정 로직으로 넣은 후 반환해달고 합니다.
- 여기서 봐야할 부분은 로직입니다. 방향을 돌릴 때마다 시작좌표가이 00이라고 할 때 (n-1)씩 3번 증가 후 (n-2)씩 2번 증가하고 이후 (n-3)씩 2번 증가합니다. 여기서 처음에는 3번 이후에는 2번씩 같은 크기만큼 이동한다는것을 알 수 있었습니다. 이것을 반복문으로 바꾸어 로직을 수행하면 위와 같은 코드가 됩니다.
결과
'코틀린 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] - 의상(Kotlin) (0) | 2023.08.30 |
---|---|
[프로그래머스] - 가장 가까운 같은 글자(Kotlin) (0) | 2023.08.29 |
[프로그래머스] - 두 개 뽑아서 더하기(Kotlin) (0) | 2023.08.28 |
[프로그래머스] - 문자열 잘라서 정렬하기(Kotlin) (0) | 2023.08.28 |
[프로그래머스] - 배열의 길이를 2의 거듭제곱으로 만들기(Kotlin) (0) | 2023.08.28 |