문제설명
양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n의 제곱까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.
제한사항
- 1 ≤ n ≤ 30
입출력 예 & 설명
- 입출력 예 #1
- 예제 1번의 n의 값은 4로 4 × 4 배열에 다음과 같이 1부터 16까지 숫자를 채울 수 있습니다.
- 따라서 [[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까지 숫자를 채울 수 있습니다.
- 따라서 [[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 합니다.
나의 풀이
이 문제가 <코딩 기초 트레이닝> 문제에서 제일 난이도가 있다고 생각합니다.
문제 자체는 어렵지 않지만 문제를 함수로 한 번에 풀 수 없고 문제를 이해하고 로직을 짜야하기 때문에 쉽지 않은 문제라고 생각합니다.
먼저 제가 접근한 방법을 쉽게 설명하자면 다음과 같습니다.
n = 4 일 때 다음과 같은 4x4 matrix가 생성됩니다.
matrix의 row를 접근할 startRow, EndRow
matrix의 col를 접근할 startCol, endCol
4개의 접근 변수를 이용해서 행렬을 접근합니다.
4개의 접근 변수를 Top Row → Right Column → Bottom Row → Left Column 순서대로 접근을 하고, 4개의 변수를 순서에 맞게 배열의 중심(빨간색 점)으로 좁혀가야 하는데 그러면 각 변수를 다음과 같이 접근해야 합니다.
Top Row (startRow 한 칸 내리기 ++)
↓
Right Column (endCol 왼쪽으로 이동 --)
↓
Bottom Row (endRow 한칸 올리기 --)
↓
Left Column (startCol 오른쪽으로 이동 ++)
문제의 풀이를 설명하자면 2번째 줄에서 Array.from() 메서드를 사용해서 길이가 n인 배열을 만들어주고, 콜백함수에서 다시 n개의 배열을 만들어주고 fill() 메서드를 사용하여 0으로 채워줍니다.
그러면 0으로 채워진 n X n의 matrix가 형성되고, 각 2차원 배열에 넣어줄 숫자 num과 위에서 설명한 4개의 변수를 초기화해 줍니다.
이때 각 startRow와 startCol의 시작은 0이고, end는 n-1로 배열의 끝으로 설정합니다.
7번째 줄에서 각 start변수가 end보다 작을 때만 while문을 돌려줘야 합니다. 그리고 while문 안에서는 4개의 접근 변수를 아래와 같이 접근해야 합니다.
< Top Row >
- startRow 고정, startCol 증가
< Right Column >
- endCol 고정, startRow 증가
< Bottom Row >
- endRow 고정 , endCol 감소
< Left Column >
- startCol 고정 , endRow 감소
위와 같이 접근을 하면 나선형으로 순환하는 배열이 완성되고 완성된 배열을 반환하여 마무리했습니다.
'Coding Test > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 직사각형 넓이 구하기 (JavaScript) (1) | 2024.02.25 |
---|---|
[프로그래머스] 캐릭터의 자표 (JavaScript) (1) | 2024.02.25 |
[프로그래머스] 주사위 게임 3 (JavaScript) (0) | 2024.02.24 |
[프로그래머스] 배열 조각하기 (JavaScript) (0) | 2024.02.22 |
[프로그래머스] 배열 만들기 2 (JavaScript) (0) | 2024.02.21 |