1. 0~100까지 임의의 수를 30개 발생시켜 배열에 넣은 후 정렬하세요.
조건 1) 정렬 전/후의 값을 화면에 출력.
조건 2) sort 알고리즘 중 사용한 알고리즘을 설명한 레포트 (형식 무관, 내용만 제출) 첨부.
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class HW_ArraySrot_MatrixArray {
public static void main(String[] args) {
// 1. 0~100까지 임의의 수를 30개 발생시켜 배열에 넣은 후 정렬하세요.
// 조건 1) 정렬 전/후의 값을 화면에 출력.
// 조건 2) sort 알고리즘 중 사용한 알고리즘을 설명한 레포트 (형식 무관, 내용만 제출) 첨부.
Random r = new Random();
int thirtyArray[] = new int[30];
for (int i = 0; i < thirtyArray.length; i++) {
thirtyArray[i] = r.nextInt(101); // 0~100까지니까 101이 들어가야 0~100이 생성된다.
}
System.out.println("숫자 30개는 다음과 같습니다. " + Arrays.toString(thirtyArray));
Arrays.sort(thirtyArray);
System.out.println("숫자 30개를 정렬했습니다. " + Arrays.toString(thirtyArray));
}
}
결과 :
숫자 30개는 다음과 같습니다. [68, 75, 90, 97, 33, 86, 22, 45, 23, 71, 71, 79, 41, 28, 30, 41, 9, 2, 60, 4, 58, 67, 43, 83, 69, 1, 27, 96, 60, 77]
숫자 30개를 정렬했습니다. [1, 2, 4, 9, 22, 23, 27, 28, 30, 33, 41, 41, 43, 45, 58, 60, 60, 67, 68, 69, 71, 71, 75, 77, 79, 83, 86, 90, 96, 97]
2. 사용자에게 9개의 숫자를 입력 받아서 3x3 이중 배열에 넣은 후 각 행의 덧셈 합을 출력하시오.
조건 1) 출력시 4x4 행렬로 출력. 마지막 줄에는 덧셈 합.
조건 2) 데이터는 정렬된 형식으로 출력할 것.
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class HW_ArraySrot_MatrixArray {
public static void main(String[] args) {
// 2. 사용자에게 9개의 숫자를 입력 받아서 3x3 이중 배열에 넣은 후 각 행의 덧셈 합을 출력하시오.
// 조건 1) 출력시 4x4 행렬로 출력. 마지막 줄에는 덧셈 합.
// 조건 2) 데이터는 정렬된 형식으로 출력할 것.
Scanner s = new Scanner(System.in);
int matrix[][] = new int[3][3];
System.out.println("숫자를 9개 입력하겠습니다.\n");
for (int i = 0; i < matrix.length; i++) { // 여기다가는 matrix[i]를 쓰면 안 된다. for문 조건에는 인덱스를 쓰면 정확한 i를 모르는 상태에서 matrix[i]에 접근하기 때문에 에러가 발생한다. 그리고 어차피 행이 몇 개 있는지를 알려면 matrix.length를 써야한다. matrix[i].length를 쓰면 행이 아니라 열을 구한다.
for (int j = 0; j < matrix[i].length; j++) { // 여기는 matrix[i]를 쓰면 된다. 바깥 for문에 의해 정확한 i값이 정해져서 들어오고 배열 안의 i번째 배열에 값이 몇개 있는지. 즉, 행렬 구조로 생각해볼 때 열이 몇개인지를 확인할 수 있다.
System.out.print((i * 3 + j + 1) + "번째 숫자를 입력해주세요. ");
matrix[i][j] = s.nextInt();
// System.out.print(i + "" + j); // 디버깅용
}
Arrays.sort(matrix[i]);
System.out.println("");
}
// 디버깅
// System.out.println(Arrays.toString(matrix[0]));
// System.out.println(Arrays.toString(matrix[1]));
// System.out.println(Arrays.toString(matrix[2]));
int matrixSum[][] = new int[4][4];
for (int i = 0; i < matrixSum.length; i++) {
for (int j = 0; j < matrixSum[i].length; j++) {
if (i < 3 && j < 3) {
matrixSum[i][j] = matrix[i][j];
} else if (j == 3) {
matrixSum[i][j] = Arrays.stream(matrixSum[i]).sum();
// System.out.println(matrixSum[i][j]); // 디버깅용
} else { // if i == 3 인 경우인데 나머지 조건이 위에 앞선 조건으로 들어가 있어 그냥 else만 써도 된다.
matrixSum[i][j] = matrixSum[0][j] + matrixSum[1][j] + matrixSum[2][j];
// System.out.println(matrixSum[i][j]); // 디버깅용
}
// System.out.print(i + "" + j); // 디버깅용
}
}
for (int i = 0; i < matrixSum.length; i++) {
System.out.println(Arrays.toString(matrixSum[i]));
}
}
}
결과 :
숫자를 9개 입력하겠습니다.
1번째 숫자를 입력해주세요. 9
2번째 숫자를 입력해주세요. 8
3번째 숫자를 입력해주세요. 7
4번째 숫자를 입력해주세요. 6
5번째 숫자를 입력해주세요. 5
6번째 숫자를 입력해주세요. 4
7번째 숫자를 입력해주세요. 3
8번째 숫자를 입력해주세요. 2
9번째 숫자를 입력해주세요. 1
[7, 8, 9, 24]
[4, 5, 6, 15]
[1, 2, 3, 6]
[12, 15, 18, 45]
위에 보면 2중 for문을 사용했는데 for문 조건에는 인덱스 변수를 쓰면 안 된다.
정확히 i의 값을 모르는 상태에서 matrix[i]를 접근하기 때문에 matrix[알 수 없는 숫자(매번 바뀜)]을 접근해서 에러가 발생한다.
for문 밖에서 matrix[i]를 해서 3이 나왔다고 절대 그냥 가져다 쓰면 안 된다.
하지만 안쪽 for문에서는 matrix[i]를 써도 된다. 바깥 for문에 의해 i 값이 정해져서 들어오기 때문이다.
그리고 다시 생각해보니... 어차피
matrix = [ [A1,A2,A3] , [B1,B2,B3] , [C1,C2,C3] ]
구조라 매트릭스 구조로 이미지를 형상화 하면
matrix =
[A1,A2,A3]
[B1,B2,B3]
[C1,C2,C3]
구조다. 따라서 matrix의 행을 구하고 싶으면 그냥 matrix.length 해서 첫 번째 for문에 넣어주고 열을 구하고 싶으면 matrix[i].length 해서 넣어주면 되는 것이다. 제발... 이해가 안 될 때는 머리로만 형상화 하지 말고 그려보자.
'개발자 > Java' 카테고리의 다른 글
Java (자바) 숫자 + 문자의 자료형 판단 (묵시적 형변환) (0) | 2020.04.06 |
---|---|
Java (자바) 배열 정렬하기 (0) | 2020.04.06 |
Java (자바) 메소드 (0) | 2020.04.05 |
Java (자바) 배열과 레퍼런스 (0) | 2020.04.05 |
Java (자바) 컴퓨터와 주사위 대전 (0) | 2020.03.29 |