● 2차원 배열을 이용하여 다음의 결과를 출력해보자
실행결과 각행의 맨 우측은 각행의 합, 맨 아래는 각 열의 합, 6행 4열 은 전체 성분의 합
Result↓
100 100 100 300
20 20 20 60
30 30 30 90
40 40 40 120
50 50 50 150
240 240 240 720
다시 한번 생각해봐도 잘 모르겠으면 일단 손으로 써보면서 생각해보자, 손으로 프로그래밍의 동작 순서를 가시화하면서 공부하는 게 생각보다 많이 괜찮다.
1) 2차 배열을 구상하자
빨간색은 주어진 배열이고 파란색은 합과 동시에 빨간색 배열을 옮겨 넣을 배열이다. 배열의 확장
이러한 아이디어가 떠오르지않는다면 그냥 이런 문제를 머리에 유형화를 시켜두는 게 정신건강에 좋다
2) 실행순서
우선 생각의 편의를 위해서 Arr의 값을 Arr2로 입력한다 , ( 코드 : Arr2 [i][j] = Arr [i][j] ; )
실행 순서를 생각해보자 우선, 첫 번째 행(Arr [0])의 합을 구해보면
Arr2 [0][0] + Arr2 [0][1] + Arr2 [0][2] = Arr2 [0][3] -> i=0 일 때
변하지 않는 값 0을 i로 두고 변하는 값을 j로 두면, for문의 중첩을 예상할 수 있다. 그렇다면 열의 합은?
Arr2 [0][0] + Arr2 [1][0] + Arr [2][0] + Arr [3][0] + Arr [4][0] = Arr2 [5][0]
Arr2 [0][1] + Arr2 [1][1] + Arr [2][1] + Arr [3][1] + Arr [4][1] = Arr2 [5][1]
Arr2 [0][2] + Arr2 [1][2] + Arr [2][2] + Arr [3][2] + Arr [4][2] = Arr2 [5][0]
i=0일 때
i = 0 일 때 어떤 식으로 프로그램이 돌아야 원하는 결과를 달성할 수 있는지에 대하여 초점을 맞춰야 한다.
계산이 중요한 게 아니다 i = 0일 때의 계산을 그림으로 그려 보면 다음과 같다.
두 가지 for 문의 진행방향이다. 총횟수는 i번 i = 0일 때 한 행의 합을 구하고 각 열의 끝에는 각열에 더해야 할 값들의 첫 번째 값을 넣어주면서 i-for 문의 진행에 따라 순차적으로 합해진다. 다시 말하면 i-for문이 한번 돌 때 한 행의 합이 구해지고 각열의합은 i-for문이 Arr2.length만큼 반복하고 끝마칠 때 구해진다는 말! 이것을 for문으로 구현하면 다음과 같다.
for (int i = 0; i < score.length; i++) {
for (int j = 0; j < score[i].length; j++) {
result[i][j]=score[i][j];
result[i][score[0].length] += result[i][j];
result[score.length][j] += result[i][j];
result[score.length][score[0].length] += result[i][j]; // 모든 배열의 합
}
}
Answer
public static void main(String[] args) {
int[][] Arr = {
{100, 100, 100}
, {20, 20, 20}
, {30, 30, 30}
, {40, 40, 40}
, {50, 50, 50}
};
int[][] Arr2 = new int[Arr.length + 1][Arr[0].length + 1];
for (int i = 0; i < Arr.length; i++) {
for (int j = 0; j < Arr[i].length; j++) {
Arr2[i][j]=Arr[i][j];
Arr2[i][Arr[0].length] += Arr2[i][j];
Arr2[Arr.length][j] += Arr2[i][j];
Arr2[Arr.length][Arr[0].length] += Arr2[i][j];
}
}
for (int i = 0; i < Arr2.length; i++) {
for (int j = 0; j < Arr2[i].length; j++) {
System.out.printf("%4d", Arr2[i][j]);
}
System.out.println();
}
}
'Java > Daily-Java' 카테고리의 다른 글
[Array] 2차원 배열의 90도 회전 (0) | 2021.04.20 |
---|---|
[Array] 동전 거슬러주기 _ Part 2 (응용) (0) | 2021.04.15 |
[Array] 동전 거슬러주기 _ Part 1 (0) | 2021.04.15 |
[Array] 배열을 응용한 " * " 출력 예제 (0) | 2021.04.13 |
[Array] 행렬의 곱셈 (0) | 2021.04.11 |