C와 C++로 행렬 전치하기
이 레슨에서는 행과 열의 역할을 바꿔 행렬의 전치를 출력합니다.
소개
행렬을 전치한다는 것은 행을 열로, 열을 행으로 바꾸는 것입니다. i행 j열에 있던 값은 j행 i열로 옮겨 갑니다. 2행 3열 행렬을 전치하면 3행 2열 행렬이 됩니다.
핵심 정리
- 컴파일러 경고(compiler warnings)를 켜고 모두 고치세요.
- 각 값의 타입과 수명(lifetime)을 정확히 이해하세요.
- 입력 데이터와 배열 인덱스의 범위를 항상 확인하세요.
동작 원리 보기
transpose를 누르면 행과 열이 바뀝니다. 칸을 가리키면 새 위치와 메모리 오프셋을 볼 수 있습니다.
C와 C++ 코드 예제
C
main.c
#include <stdio.h>
int main(void) {
int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
// Visit columns first to print the transposed shape.
for (int column = 0; column < 3; ++column) { for (int row = 0; row < 2; ++row) printf("%s%d", row ? " " : "", matrix[row][column]); puts(""); }
}
1 4
2 5
3 6
C++
main.cpp
#include <array>
#include <iostream>
int main() {
std::array<std::array<int, 3>, 2> matrix{{{{1, 2, 3}}, {{4, 5, 6}}}};
// Visit columns first to print the transposed shape.
for (size_t column = 0; column < 3; ++column) { for (size_t row = 0; row < 2; ++row) std::cout << (row ? " " : "") << matrix[row][column]; std::cout << '\n'; }
}
1 4
2 5
3 6
C와 C++ 비교
프로그램은 새 행렬을 만들지 않고 두 반복문의 순서를 바꿉니다. 바깥 반복문은 열을, 안쪽 반복문은 행을 돕니다. 그래서 원래 행렬의 각 열이 한 행으로 출력되어 1 4, 2 5, 3 6이 됩니다.
C
C는 작은 절차형 함수를 쓰고, 데이터가 메모리에 어떻게 표현되는지 그대로 드러냅니다.
C++
C++는 여전히 저수준 작업을 할 수 있으면서, 라이브러리 타입과 더 안전한 추상화를 더합니다.
연습 문제
두 버전을 모두 실행한 다음 코드를 바꿔 보면서 각 언어가 주는 안전성의 차이를 살펴보세요.
- 잘못된 입력과 경계값으로 테스트해 보세요.
- -Wall -Wextra -Wpedantic 옵션으로 컴파일해 경고를 더 많이 켜 보세요.
- 공통 선언은 헤더 파일에, 구현은 별도의 파일에 두어 보세요.
챌린지로 연습하기
이 레슨에서 배운 내용으로 실제 문제를 풀어 보세요. 모든 챌린지는 브라우저에서 실행되며 즉시 테스트와 AI 리뷰를 받을 수 있습니다.
모든 챌린지