행과 열로 이루어진 2차원 배열, 즉 행렬이 주어졌을 때, 모든 행과 열의 합 중에서 주대각선(Principal Diagonal) 또는 부대각선(Secondary Diagonal)의 합과 일치하는 경우의 개수를 구하는 것이 과제입니다.
입력 예시 1
int arr[row][col] = {
{ 4, 1, 7 },
{ 10, 3, 5 },
{ 2, 2, 11}
}출력
대각선 합과 같은 행/열의 개수: 2
설명
주대각선의 합은 4 + 3 + 11 = 18이고, 부대각선의 합은 7 + 3 + 2 = 12입니다.
각 행의 합은 다음과 같습니다.
- 1행: 4 + 1 + 7 = 12 → 부대각선 합과 일치 (TRUE)
- 2행: 10 + 3 + 5 = 18 → 주대각선 합과 일치 (TRUE)
- 3행: 2 + 2 + 11 = 15 → 불일치 (FALSE)
각 열의 합은 다음과 같습니다.
- 1열: 4 + 10 + 2 = 16 → 불일치 (FALSE)
- 2열: 1 + 3 + 2 = 6 → 불일치 (FALSE)
- 3열: 7 + 5 + 11 = 23 → 불일치 (FALSE)
따라서 대각선의 합과 일치하는 행/열의 개수는 2개입니다.
입력 예시 2
int arr[row][col] = {
{ 1, 2, 3 },
{ 4, 5, 2 },
{ 7, 9, 10}
}출력
대각선 합과 같은 행/열의 개수: 2
설명
주대각선의 합은 1 + 5 + 10 = 16이고, 부대각선의 합은 7 + 3 + 5 = 15입니다.
각 행의 합은 6(FALSE), 11(FALSE), 26(FALSE)으로 모두 일치하지 않습니다.
각 열의 합은 다음과 같습니다.
- 1열: 7 + 4 + 1 = 12 → 불일치 (FALSE)
- 2열: 9 + 5 + 2 = 16 → 주대각선 합과 일치 (TRUE)
- 3열: 3 + 2 + 10 = 15 → 부대각선 합과 일치 (TRUE)
따라서 이 경우에도 대각선의 합과 일치하는 행/열의 개수는 2개입니다.
문제 해결 접근 방식
- 행 크기와 열 크기를 가진 2차원 배열을 생성하여 행렬을 만듭니다.
- 주대각선 합과 부대각선 합을 저장할 변수를 선언하고, 개수를 저장할 카운트 변수도 함께 준비합니다.
- i는 0부터 col까지 증가하고, j는 col-1부터 감소하는 FOR 루프를 시작합니다.
- 루프 내부에서 principal에 matrix[i][i]를 더하고, secondary에 matrix[i][j]를 더하여 두 대각선의 합을 계산합니다.
- i가 0부터 col까지 반복되는 FOR 루프를 시작합니다.
- 루프 내부에서 r(행 합)과 c(열 합)를 0으로 초기화한 뒤, j가 0부터 col까지 반복되는 내부 FOR 루프를 실행합니다.
- 첫 번째 내부 루프에서 r에 matrix[i][j]를 더하여 i번째 행의 합을 구합니다.
- 두 번째 내부 루프에서 c에 matrix[j][i]를 더하여 i번째 열의 합을 구합니다.
- r이 principal 또는 secondary와 같으면 카운트를 1 증가시킵니다.
- c가 principal 또는 secondary와 같으면 카운트를 1 증가시킵니다.
- 모든 반복이 끝나면 최종 카운트를 반환합니다.
- 결과를 출력합니다.
예제 코드
#include <iostream>
#define row 3
#define col 3
using namespace std;
int diagonal_sum(int matrix[row][col]){
int principal = 0;
int secondary = 0;
int r = 0;
int c = 0;
int count = 0;
int i = 0, j = 0;
for (i = 0, j = col - 1; i < col; i++, j--){
principal += matrix[i][i];
secondary += matrix[i][j];
}
for (int i = 0; i < col; i++){
r = 0;
c = 0;
for (int j = 0; j < col; j++){
r += matrix[i][j];
}
for (int j = 0; j < col; j++){
c += matrix[j][i];
}
if ((r == principal) || (r == secondary)){
count++;
}
if ((c == principal) || (c == secondary)){
count++;
}
}
return count;
}
int main(){
int matrix[row][col] = {
{ 4, 1, 7 },
{ 10, 3, 5 },
{ 2, 2, 11}};
cout<<"대각선 합과 같은 행/열의 개수: "<<diagonal_sum(matrix);
return 0;
}실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
대각선 합과 같은 행/열의 개수: 2