위 코드는 주어진 크기 nn의 정사각형 배열을 나선형으로 채우는 함수를 구현한 것입니다. 이 함수는 1부터 n2n^2까지의 숫자를 시계방향으로 배열에 채웁니다.
코드의 작동 방식을 단계별로 설명하겠습니다.
초기 설정
- 크기가 nn x nn인 2차원 배열 array를 0으로 초기화합니다.
- 배열에 채울 숫자를 count 변수에 1로 초기화합니다.
- 나선형으로 채우기 위해 사용되는 시작과 끝의 행과 열 인덱스를 설정합니다.
나선형 채우기
- count가 n2n^2보다 작거나 같은 동안 반복합니다.
위쪽 행 채우기
- startRow 행의 startCol부터 endCol까지의 열을 왼쪽에서 오른쪽으로 이동하면서 숫자를 채웁니다.
- startRow를 1 증가시켜 다음 반복에서 위쪽 행을 건너뜁니다.
오른쪽 열 채우기
- endCol 열의 startRow부터 endRow까지의 행을 위쪽에서 아래쪽으로 이동하면서 숫자를 채웁니다.
- endCol을 1 감소시켜 다음 반복에서 오른쪽 열을 건너뜁니다.
아래쪽 행 채우기
- endRow 행의 endCol부터 startCol까지의 열을 오른쪽에서 왼쪽으로 이동하면서 숫자를 채웁니다.
- endRow를 1 감소시켜 다음 반복에서 아래쪽 행을 건너뜁니다.
왼쪽 열 채우기
- startCol 열의 endRow부터 startRow까지의 행을 아래쪽에서 위쪽으로 이동하면서 숫자를 채웁니다.
- startCol을 1 증가시켜 다음 반복에서 왼쪽 열을 건너뜁니다.
최종 반환
- 나선형으로 숫자가 채워진 2차원 배열을 반환합니다.
예제
solution(3)을 호출하면 다음과 같은 배열이 반환됩니다:
이 예제는 코드가 나선형으로 숫자를 채우는 방법을 잘 보여줍니다.
위 코드에서 endRow와 endCol을 n−1n-1로 초기화하는 이유는 배열의 인덱스가 0부터 시작하기 때문입니다.
배열 인덱스의 이해
배열의 인덱스는 0부터 시작합니다. 따라서 크기 nn의 배열의 마지막 인덱스는 n−1n-1입니다. 예를 들어, n=3n = 3인 경우, 배열의 인덱스는 다음과 같습니다:
초기화의 의미
- startRow와 startCol은 배열의 시작 인덱스를 나타내며, 0으로 초기화합니다.
- endRow와 endCol은 배열의 끝 인덱스를 나타내며, n−1n-1로 초기화합니다.
이렇게 초기화함으로써, 초기에는 배열의 첫 번째 행(startRow = 0)과 마지막 열(endCol = n-1)을 처리할 준비가 됩니다.
나선형 채우기의 이해
나선형으로 배열을 채울 때, 배열의 가장 바깥쪽에서 시작하여 점점 안쪽으로 들어갑니다.
- 처음에는 startRow를 0으로 시작하여 첫 번째 행을 왼쪽에서 오른쪽으로 채웁니다.
- 다음으로 endCol을 n−1n-1로 시작하여 마지막 열을 위에서 아래로 채웁니다.
- 그다음 endRow를 n−1n-1로 시작하여 마지막 행을 오른쪽에서 왼쪽으로 채웁니다.
- 마지막으로 startCol을 0으로 시작하여 첫 번째 열을 아래에서 위로 채웁니다.
그 후, 각 단계가 끝날 때마다 startRow, endCol, endRow, startCol을 업데이트하여 배열의 나머지 부분을 계속 채웁니다.
예시
n = 3일 때, 초기값 설정:
- startRow = 0
- endRow = 2 (즉, n−1n-1)
- startCol = 0
- endCol = 2 (즉, n−1n-1)
배열을 나선형으로 채우면 다음과 같은 순서로 진행됩니다:
- 첫 번째 행 (startRow = 0): 왼쪽에서 오른쪽으로 [1, 2, 3]
- 마지막 열 (endCol = 2): 위에서 아래로 [4, 5]
- 마지막 행 (endRow = 2): 오른쪽에서 왼쪽으로 [6, 7]
- 첫 번째 열 (startCol = 0): 아래에서 위로 [8]
- 다음으로, 내부의 작은 사각형을 채우기 위해 인덱스를 업데이트하고 반복
따라서, endRow와 endCol을 n−1n-1로 초기화하는 것은 배열의 마지막 인덱스를 나타내기 위한 것입니다.
위 코드는 배열의 현재 행을 왼쪽에서 오른쪽으로 순서대로 숫자를 채우는 부분입니다. 예를 들어, n=3n = 3일 때의 과정을 자세히 설명하겠습니다.
초기 설정
먼저 초기 배열을 설정하고, 필요한 변수를 초기화합니다:
초기 상태의 배열:
첫 번째 행 채우기
위 코드 부분을 실행하여 배열의 첫 번째 행을 채웁니다:
반복문 동작
- range(startCol, endCol + 1)는 range(0, 3)과 동일하며, i는 0, 1, 2가 됩니다.
- startRow는 0으로 초기화되어 첫 번째 행을 가리킵니다.
반복문이 실행되면서 배열이 다음과 같이 변경됩니다:
- i = 0일 때:배열 상태:
-
코드 복사1 0 0 0 0 0 0 0 0
-
python코드 복사array[0][0] = count # count = 1 count += 1 # count = 2
- i = 1일 때:배열 상태:
-
코드 복사1 2 0 0 0 0 0 0 0
-
python코드 복사array[0][1] = count # count = 2 count += 1 # count = 3
- i = 2일 때:배열 상태:
-
코드 복사1 2 3 0 0 0 0 0 0
-
python코드 복사array[0][2] = count # count = 3 count += 1 # count = 4
startRow 증가
반복문이 끝난 후, startRow를 1 증가시킵니다:
이제 배열의 첫 번째 행이 채워졌고, startRow는 1이 되어 다음 단계에서는 두 번째 행부터 작업이 진행됩니다.
요약
이 과정은 배열의 startRow 행을 startCol에서 endCol까지 왼쪽에서 오른쪽으로 숫자를 채우는 작업입니다. 이후 startRow를 증가시켜 다음 행을 가리키도록 준비합니다.
def soultion(n):
array = [[0]*n for _ in range(n)]
count = 1
sr = 0
er = n-1
sc = 0
ec = n-1
while count <= n*n:
for i in range(sc, ec+1):
array[sr][i] = count
count +=1
sr +=1
for i in range(sr, er+1):
array[i][ec] = count
count +=1
ec -=1
for i in range(ec, sc-1, -1):
array[er][i] = count
count +=1
er-=1
for i in rnage(er, sr-1, -1):
array[i][sc] = count
count +=1
sc+=1
return array