새싹일지

정수를 나선형으로 배치하기 모임

gamnyam 2024. 7. 2. 09:45

위 코드는 주어진 크기 nn의 정사각형 배열을 나선형으로 채우는 함수를 구현한 것입니다. 이 함수는 1부터 n2n^2까지의 숫자를 시계방향으로 배열에 채웁니다.

코드의 작동 방식을 단계별로 설명하겠습니다.

초기 설정

python
코드 복사
array = [[0] * n for _ in range(n)]
  • 크기가 nn x nn인 2차원 배열 array를 0으로 초기화합니다.
python
코드 복사
count = 1
  • 배열에 채울 숫자를 count 변수에 1로 초기화합니다.
python
코드 복사
startRow = 0 endRow = n - 1 startCol = 0 endCol = n - 1
  • 나선형으로 채우기 위해 사용되는 시작과 끝의 행과 열 인덱스를 설정합니다.

나선형 채우기

python
코드 복사
while count <= n * n:
  • count가 n2n^2보다 작거나 같은 동안 반복합니다.

위쪽 행 채우기

python
코드 복사
for i in range(startCol, endCol + 1): array[startRow][i] = count count += 1 startRow += 1
  • startRow 행의 startCol부터 endCol까지의 열을 왼쪽에서 오른쪽으로 이동하면서 숫자를 채웁니다.
  • startRow를 1 증가시켜 다음 반복에서 위쪽 행을 건너뜁니다.

오른쪽 열 채우기

python
코드 복사
for i in range(startRow, endRow + 1): array[i][endCol] = count count += 1 endCol -= 1
  • endCol 열의 startRow부터 endRow까지의 행을 위쪽에서 아래쪽으로 이동하면서 숫자를 채웁니다.
  • endCol을 1 감소시켜 다음 반복에서 오른쪽 열을 건너뜁니다.

아래쪽 행 채우기

python
코드 복사
for i in range(endCol, startCol - 1, -1): array[endRow][i] = count count += 1 endRow -= 1
  • endRow 행의 endCol부터 startCol까지의 열을 오른쪽에서 왼쪽으로 이동하면서 숫자를 채웁니다.
  • endRow를 1 감소시켜 다음 반복에서 아래쪽 행을 건너뜁니다.

왼쪽 열 채우기

python
코드 복사
for i in range(endRow, startRow - 1, -1): array[i][startCol] = count count += 1 startCol += 1
  • startCol 열의 endRow부터 startRow까지의 행을 아래쪽에서 위쪽으로 이동하면서 숫자를 채웁니다.
  • startCol을 1 증가시켜 다음 반복에서 왼쪽 열을 건너뜁니다.

최종 반환

python
코드 복사
return array
  • 나선형으로 숫자가 채워진 2차원 배열을 반환합니다.

예제

solution(3)을 호출하면 다음과 같은 배열이 반환됩니다:

csharp
코드 복사
[ [1, 2, 3], [8, 9, 4], [7, 6, 5] ]

이 예제는 코드가 나선형으로 숫자를 채우는 방법을 잘 보여줍니다.

 
 
4o
왜 위의 코드에서 endRow 와 endCol을 n-1로 초기화해?
 
ChatGPT

위 코드에서 endRow와 endCol을 n−1n-1로 초기화하는 이유는 배열의 인덱스가 0부터 시작하기 때문입니다.

배열 인덱스의 이해

배열의 인덱스는 0부터 시작합니다. 따라서 크기 nn의 배열의 마지막 인덱스는 n−1n-1입니다. 예를 들어, n=3n = 3인 경우, 배열의 인덱스는 다음과 같습니다:

코드 복사
0 1 2

초기화의 의미

  • startRow와 startCol은 배열의 시작 인덱스를 나타내며, 0으로 초기화합니다.
  • endRow와 endCol은 배열의 끝 인덱스를 나타내며, n−1n-1로 초기화합니다.

이렇게 초기화함으로써, 초기에는 배열의 첫 번째 행(startRow = 0)과 마지막 열(endCol = n-1)을 처리할 준비가 됩니다.

나선형 채우기의 이해

나선형으로 배열을 채울 때, 배열의 가장 바깥쪽에서 시작하여 점점 안쪽으로 들어갑니다.

  1. 처음에는 startRow를 0으로 시작하여 첫 번째 행을 왼쪽에서 오른쪽으로 채웁니다.
  2. 다음으로 endCol을 n−1n-1로 시작하여 마지막 열을 위에서 아래로 채웁니다.
  3. 그다음 endRow를 n−1n-1로 시작하여 마지막 행을 오른쪽에서 왼쪽으로 채웁니다.
  4. 마지막으로 startCol을 0으로 시작하여 첫 번째 열을 아래에서 위로 채웁니다.

그 후, 각 단계가 끝날 때마다 startRow, endCol, endRow, startCol을 업데이트하여 배열의 나머지 부분을 계속 채웁니다.

예시

n = 3일 때, 초기값 설정:

  • startRow = 0
  • endRow = 2 (즉, n−1n-1)
  • startCol = 0
  • endCol = 2 (즉, n−1n-1)

배열을 나선형으로 채우면 다음과 같은 순서로 진행됩니다:

  1. 첫 번째 행 (startRow = 0): 왼쪽에서 오른쪽으로 [1, 2, 3]
  2. 마지막 열 (endCol = 2): 위에서 아래로 [4, 5]
  3. 마지막 행 (endRow = 2): 오른쪽에서 왼쪽으로 [6, 7]
  4. 첫 번째 열 (startCol = 0): 아래에서 위로 [8]
  5. 다음으로, 내부의 작은 사각형을 채우기 위해 인덱스를 업데이트하고 반복

따라서, endRow와 endCol을 n−1n-1로 초기화하는 것은 배열의 마지막 인덱스를 나타내기 위한 것입니다.

 

for i in range(startCol, endCol + 1): array[startRow][i] = count count += 1 startRow += 1 위 코드를 예시를 들어 자세히 설명해줘
 
ChatGPT

위 코드는 배열의 현재 행을 왼쪽에서 오른쪽으로 순서대로 숫자를 채우는 부분입니다. 예를 들어, n=3n = 3일 때의 과정을 자세히 설명하겠습니다.

초기 설정

먼저 초기 배열을 설정하고, 필요한 변수를 초기화합니다:

python
코드 복사
n = 3 array = [[0] * n for _ in range(n)] # 3x3 배열을 0으로 초기화 count = 1 startRow = 0 endRow = n - 1 # 2 startCol = 0 endCol = n - 1 # 2

초기 상태의 배열:

코드 복사
0 0 0 0 0 0 0 0 0

첫 번째 행 채우기

위 코드 부분을 실행하여 배열의 첫 번째 행을 채웁니다:

python
코드 복사
for i in range(startCol, endCol + 1): # range(0, 3) array[startRow][i] = count count += 1 startRow += 1

반복문 동작

  • range(startCol, endCol + 1)는 range(0, 3)과 동일하며, i는 0, 1, 2가 됩니다.
  • startRow는 0으로 초기화되어 첫 번째 행을 가리킵니다.

반복문이 실행되면서 배열이 다음과 같이 변경됩니다:

  1. i = 0일 때:배열 상태:
  2. 코드 복사
    1 0 0 0 0 0 0 0 0
  3. python
    코드 복사
    array[0][0] = count # count = 1 count += 1 # count = 2
  4. i = 1일 때:배열 상태:
  5. 코드 복사
    1 2 0 0 0 0 0 0 0
  6. python
    코드 복사
    array[0][1] = count # count = 2 count += 1 # count = 3
  7. i = 2일 때:배열 상태:
  8. 코드 복사
    1 2 3 0 0 0 0 0 0
  9. python
    코드 복사
    array[0][2] = count # count = 3 count += 1 # count = 4

startRow 증가

반복문이 끝난 후, startRow를 1 증가시킵니다:

python
코드 복사
startRow += 1 # 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

'새싹일지' 카테고리의 다른 글

0702 새싹일지  (0) 2024.07.02
주사위 게임 3 이거모임  (0) 2024.07.02
0701 새싹일지  (0) 2024.07.01
0328 새싹일지  (0) 2024.06.28
0627 새싹일지  (0) 2024.06.27