Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 행렬을 Z자 형태로 출력하는 프로그램

이 글에서는 주어진 문제 상황을 해결하기 위한 풀이 방법과 접근 과정을 자세히 알아보겠습니다.

문제 정의

문제 — n×n 크기의 정방행렬(스퀘어 행렬)이 주어졌을 때, 행렬의 모든 요소를 Z자(Z form) 형태로 화면에 출력해야 합니다.

Z자 형태란 행렬을 다음 순서대로 순회하는 것을 의미합니다.

  • 첫 번째 행: 왼쪽에서 오른쪽 끝까지 순회합니다.
  • 부대각선(반대 대각선): 오른쪽 위에서 왼쪽 아래로 대각선 방향으로 순회합니다.
  • 마지막 행: 왼쪽에서 오른쪽 끝까지 순회합니다.

이 세 구간을 이어서 그리면 영문 대문자 'Z' 모양이 완성됩니다.

예제 코드

여기서는 입력 행렬을 코드에 직접 포함시켜 코드의 흐름을 보여드리겠습니다.

arr = [[1, 2, 6, 9],
   [1, 2, 3, 1],
   [7, 1, 3, 5],
   [1, 8, 7, 5]]

n = len(arr[0])
i = 0

# 첫 번째 행 출력 (마지막 요소 제외)
for j in range(0, n-1):
   print(arr[i][j], end=' ')

k = 1
# 부대각선 요소 출력
for i in range(0, n):
   for j in range(n, 0, -1):
      if(j == n-k):
         print(arr[i][j], end=' ')
         break
   k += 1

# 마지막 행 출력
i = n-1
for j in range(0, n):
   print(arr[i][j], end=' ')

실행 결과

1 2 6 9 3 1 1 8 7 5

코드 동작 원리

모든 변수와 함수는 아래 그림과 같이 전역 범위(global scope)에 선언되어 있습니다.

파이썬으로 행렬을 Z자 형태로 출력하는 프로그램

코드가 동작하는 과정을 단계별로 살펴보면 다음과 같습니다.

  1. 첫 번째 루프: 인덱스 j를 0부터 n-2까지 반복하며 첫 행의 요소를 출력합니다. 첫 행의 마지막 요소는 부대각선 순회에서 다시 등장하므로 여기서는 제외합니다.
  2. 두 번째 루프: 각 행마다 열 인덱스를 뒤에서부터 검사하여, 해당 행의 부대각선 위치(j == n-k)에 있는 요소 하나만 골라 출력합니다.
  3. 세 번째 루프: 마지막 행의 모든 요소를 처음부터 끝까지 출력합니다.

이 알고리즘은 행렬의 모든 요소를 일일이 확인하지 않고 출력에 필요한 요소만 방문하므로 시간 복잡도는 O(n)이며, 별도의 추가 메모리 없이 O(1)의 공간 복잡도로 해결할 수 있습니다.

결론

이 글에서는 파이썬을 이용해 행렬을 Z자 형태로 출력하는 방법을 알아보았습니다. 전체 행렬을 탐색하는 대신 첫 행, 부대각선, 마지막 행의 세 구간으로 나누어 순회하면 누구나 쉽게 Z 형태 출력 로직을 구현할 수 있습니다.