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 해서 넣어주면 되는 것이다. 제발... 이해가 안 될 때는 머리로만 형상화 하지 말고 그려보자.

 

+ Recent posts