프로그래밍기초 제10주 실습과제

       

배열 2

       


아래 모든 문제에 적용되는 지시 사항

  • 클래스 선언문 바로 위에 그 클래스에 대한 설명을 주석으로 넣으시오.
  • main 함수 외의 함수에도 주석을 넣으시오.
  • 주석의 첫 부분은 /** 로 시작하고 끝 부분은 */로 마칩니다.
  • 주석을 적어 넣지 않거나 들여쓰기를 하지 않으면 감점합니다.

       

우선 아래 자료를 통해 행렬의 기초를 공부하세요.

행렬이란? (8분 23초 길이 유튜브 동영상)

       


이차원 배열, 배열을 파라미터로 갖는 메소드


P1

지난 주 실습과제 8번 문제를 다시 읽어보시오. 그 문제의 printArray 메소드는 배열을 파라미터로 갖는 메소드였습니다. 이 문제에서는 2차원 배열을 참조변수로 갖는 메소드를 작성해 봅니다. 클래스 이름은 ArrayUtil로 지으시오.

ArrayUtil 클래스 안에 아래와 같은 메소드를 작성하시오.

img

또, 프로젝트 폴더에 integers15.txt 파일을 만들고 아래 그림과 같이 15개의 정수를 적어 넣으시오.

데이터파일 내용

img

main 메소드에서 아래와 같은 작업을 수행하도록 하시오.

(1) integers15.txt 파일로부터 15개의 정수를 읽어 행이 3개, 열이 5개인 2차원 배열(3x5 배열)에 채우고, printMatrix 메소드를 이용하여 배열을 출력하시오.

(2) 1x10 배열에 0 이상 10 미만 정수 난수를 채우고, printMatrix 메소드를 이용하여 배열을 출력하시오. 1차원 배열은 2차원 배열의 (행이 한 개 뿐인) 특수한 형태로 볼 수도 있습니다.

프로그램 실행 결과는 아래 그림과 같습니다.

img

       

P2

ArrayUtil 클래스에 아래와 같은 기능을 추가하시오.

(1) 파라미터로 주어진 이차원 배열에 0 이상이고 파라미터로 주어진 정수 미만인 정수 난수를 채워주는 메소드를 작성하시오. 메소드 이름은 fillMatrixRandom으로 지으시오.

(2) main에 2x3 정수 배열을 만들고, fillMatrixRandom 메소드를 이용하여 0 이상, 5 미만의 정수 난수를 채우고 printMatrix 메소드를 이용하여 배열을 출력하는 코드를 추가하시오. main에 추가할 코드는 아래와 같습니다.

img

프로그램 실행 결과는 아래와 같습니다.

img

       


배열을 반환하는 메소드


지금까지는 main에서 배열을 구성한 후, 그 배열을 다른 메소드에게 넘겨주었습니다. 그러면 그 메소드가 main으로부터 받은 배열에 어떤 값들을 채우거나 배열을 출력하도록 했습니다. 아래 문제에서는 메소드가 배열을 직접 작성하고 내용을 적절히 채워 그 배열을 반환하는 메소드를 작성하도록 합니다. main은 이 메소드를 호출하고 이 메소드로부터 받은 배열을 이용(출력)합니다. 강의자료 17쪽~23쪽을 참고하시오.

       

P3

아래 지시에 따라 프로그램을 작성하시오. 클래스 이름은 ArrayReturn으로 지으시오.

(가) 아래와 같은 메소드를 작성하시오. 메소드가 스스로 배열을 만들고 배열에 숫자를 채운 후 그 배열을 반환합니다.

img

(나) main 메소드는 makeArray() 메소드를 호출하고 이 메소드로부터 반환되는 배열을 받아 그 내용을 화면에 출력합니다. ArrayUtil 아래와 같은 printArray 메소드를 추가하고, 배열을 출력할 때 이 메소드를 이용하시오. ArrayReturn 클래스 내에서 ArrayUtil 클래스의 printArray 메소드를 호출하려면 ArrayUtil.printArray(인자) 형태로 호출합니다.

img

프로그램 실행결과

img

프로그램 뼈대

img

       

P4

위 P3 문제에서 작성한 클래스를 복사하여 ArrayReturn2라는 이름의 클래스를 만드시오.

ArrayReturn2 클래스에 아래와 같은 메소드를 추가하시오. P3 문제의 makeArray 메소드는 크기가 10인 배열을 만들어 반환했지만 이 메소드는 임의로 주어진 크기(n)의 배열을 만들어 반환합니다.

img

위 메소드를 추가하면 makeArray 메소드가 두 개가 되는데, 두 메소드는 이름은 같지만 파라미터 리스트가 다르므로 다중정의(오버로딩, overloading)되는 것입니다.

main에서는 기존의 작업에 추가로 아래와 같은 작업을 합니다.

새로 작성한 makeArray(int n) 메소드를 이용하여

크기가 1인 배열을 만들고 그 내용을 출력,

크기가 2인 배열을 만들고 그 내용을 출력,

…,

크기가 10인 배열을 만들고 그 내용을 출력.

프로그램 실행 결과는 아래와 같습니다.

img

       

P5

두 개의 배열을 더하는 문제입니다. 클래스 이름은 ArrayReturn3로 지으시오.

우선 아래와 같은 기능의 메소드를 작성합니다.

img

다음으로, 아래와 같이 두 개의 데이터 파일, data1.txt, data2.txt를 만듭니다.

두 데이터 파일에는 정수가 10개씩 들어 있습니다.

img

img

main에서는 이 파일들을 읽어 두 개의 배열에 각각 저장하고 각 배열을 출력합니다.

그리고 addArrays(…) 메소드를 이용하여 덧셈을 한 후 결과로 만들어진 배열을 출력합니다.

프로그램 실행 결과

img

       

P6

두 개의 배열을 연결하는 문제입니다. 클래스 이름은 ArrayReturn4로 지으시오.

우선 아래와 같은 기능의 메소드를 작성합니다. cat은 concatenate를 줄여 쓴 것이고 concatenate는 “연결하다”의 의미를 갖는 단어입니다.

img

main에서는 두 개의 데이터 파일들을 읽어 두 개의 배열에 각각 저장한 후 각 배열을 출력합니다.

데이터 파일의 내용은 아래와 같습니다.

img

img

첫 숫자는 이 파일에 데이터가 몇 개 들어 있는지를 나타내는 메타 데이터입니다. 이 숫자는 데이터로 간주되지 않습니다.

그러니까 첫 파일의 경우, 첫 숫자가 5이므로, 방 다섯 개짜리 배열을 구성하고 다섯 개의 숫자를 저장합니다.

두 번째 파일의 경우, 첫 숫자가 3이므로, 방 세 개짜리 배열을 구성하고 세 개의 숫자를 저장합니다.

위와 같이 하려면 배열을 프로그램 첫 머리에서 구성할 수 없습니다.

파일로부터 값을 하나 읽은 후에야 비로소 배열의 크기를 얼마로 할지 결정할 수 있으므로 그 때 배열을 구성할 수 있습니다.

배열 두 개를 구성하고 출력한 후에는, catArrays(…) 메소드를 이용하여 두 배열을 연결한 새 배열을 얻고, 이 새 배열을 출력합니다.

[프로그램 실행 결과]

img

       

P7

아래 지시에 따라 0 이상 10 미만 정수 난수 20개를 배열에 저장하고 배열을 출력하는 프로그램을 완성하시오. 클래스 이름은 RandomNumbers로 지으시오.

(1) 정수 난수들을 배열에 저장하고 그 배열을 반환하는 메소드를 작성한다. 메소드 이름은 makeRandomArray로 짓는다. makeRandomArray는 파라미터로 주어진 크기(n)의 int 배열을 만들고, 0 이상이고 파라미터로 주어진 수(max) 미만인 정수 난수를 n번 발생시켜 이들을 배열에 저장한 후, 그 배열을(가리키는 참조변수를) 반환한다. (메소드 상단에 주석을 달아준다.)

(2) 0 이상 10 미만 정수 난수를 20개의 배열을 만들고 그 배열을 출력하도록 main 메소드를 작성한다. 정수 난수 배열을 만들기 위해서는 makeRandomArray 메소드를 이용한다.

프로그램 실행 예는 아래와 같습니다.

img

이어지는 문제를 풀기 위해, 행렬 합, 전치행렬, 곱행렬에 대한 아래 내용을 우선 공부하시오.

행렬 두 개를 더하는 방법

전치행렬 (움직이는 화면입니다. 20초 정도, 다시 보려면 F5를 누릅니다.)

전치행렬을 만들려면 원 행렬의 행과 열을 맞바꾸면 됩니다. (원래 행렬 A의 각 원소 aij자리에 aji를 넣으면 전치행렬이 됩니다.)

img

행렬의 곱셈 (11분 26초 길이 유튜브 동영상)

행렬 곱은 아래와 같이 계산한다. img

A 행렬의 행 갯수(위 예에서는 3)와 B 행렬의 열 갯수(위 예에서는 3)가 같아야 A X B 곱셈을 할 수 있다.

[곱셈 예 1]

img

[곱셈 예 2]

img

       

P8

아래와 같이 주어진 행렬의 전치행렬을 구하는 프로그램을 작성하시오. 클래스 이름은 MatrixTranspose로 지으시오.

  1. 주어진 행렬의 전치행렬을 만들어 반환하는 메소드를 작성한다. 메소드 이름은 transpose로 짓는다.
  2. 15개의 정수가 들어 있는 데이터 파일, integers15.txt를 읽어 3x5 이차원 배열을 채우고 이 배열을 표 형태로 출력한다.
  3. transpose 메소드를 이용하여 3x5 이차원 배열로부터 그 전치(transpose)행렬인 5x3 배열을 만들고 이 배열을 표 형태로 출력한다.

배열을 출력할 때는 ArrayUtil 클래스의 printMatrix 메소드를 이용하시오.

실행 예는 아래와 같습니다.

[실행 결과] (숫자들은 탭(“\t”)으로 분리되어 있음)

img

       

P9

아래와 같이 두 행렬의 곱을 구하는 프로그램을 작성하시오. 클래스 이름은 MatrixMultiplication으로 지으시오.

아래와 같이 주어진 두 행렬이 곱행렬을 구하여 반환하는 메소드를 먼저 작성하시오.

img

main 메소드는 파일 두 개로부터 데이터를 읽어 두 개의 행렬을 만들고, multiply 메소드를 이용하여 두 행렬의 곱행렬을 계산하고 출력하게 하시오.

프로그램을 실행하기 전에 정수 행렬이 들어 있는 두 개의 데이터 파일을 아래 그림과 같이 만드시오. 파일 이름은 matrix1.txt, matrix2.txt로 지으시오.

img

img

(프로그램 작동)

  1. 3x5, 5x3, 3x3 등 세 개의 이차원 배열을 만든다.
  2. 데이터 파일을 읽어 그 숫자들로 첫 두 개의 이차원 배열을 채운다.
  3. 두 행렬의 곱을 구하여 세 번째 이차원 배열에 저장한다.
  4. 이차원 배열 세 개를 차례로 출력한다.

행렬을 출력할 때는 ArrayUtil의 printMatrix 메소드를 이용하시오.

실행 예는 아래와 같습니다.

img

       

P10

크기가 10인 int 타입 배열에 0 이상 100 미만 정수 난수를 넣은 후, 배열의 각 원소를 차례로 출력하고, 배열의 원소들 중 가장 큰 원소, 가장 작은 원소를 출력하고, 원소들의 평균을 출력하는 프로그램을 작성하시오. 클래스 이름은 RandomStatistics로 지으시오.

단, 아래와 같은 메소드들을 작성하고 이를 이용하시오.

img

img

img

img

실행 결과 예시

img

배열을 반환하는 메소드를 작성하고 이용하는 연습은 여기까지입니다.

아래 문제들은 배열 조작 연습입니다.

       

P11 (표의 가로 합과 세로 합을 구하는 프로그램)

이차원 배열에 난수를 채운 후 가로 합과 세로 합, 총합을 추가하여 출력하는 프로그램을 작성합니다.

클래스 이름은 TablePlusArray로 지으시오.

실행 예

img

낱말 뜻

img

이렇게 하기 위해 main은 아래와 같은 작업을 해야 합니다.

  • 우선 키보드로부터 2차원 데이터의 행 수와 열 수를 입력받는다.
  • 입력받은 행 수와 열 수의 2차원 배열을 구성한다.
  • 2차원 배열에 난수를 채운다. (난수의 최대값이 얼마가 되게 할 것인지는 키보드로부터 입력받아 정함)
  • 가로 합, 세로 합을 위한 1차원 배열을 구성한다.
  • 가로 합, 세로 합을 구해 저장한다.
  • 2차원 배열과 가로 합, 세로 합 배열을 출력한다.

우선 아래와 같은 메소드들을 작성합니다.

그리고 main에서 위 작업을 하기 위해 아래 메소드들을 이용합니다.

img

img

img

img

img

img

main 메소드는 아래와 같이 구현할 수 있습니다.

img

       

P12 (표의 가로 합과 세로 합을 구하는 프로그램)

(이 문제의 끝에 있는 참고 설명까지 모두 읽은 후 프로그램을 작성하세요.)

클래스 이름은 Table로 지으시오.

이차원 배열에 난수를 채운 후 가로 합과 세로 합을 추가하여 출력하는 프로그램을 작성합니다.

위 P9 문제에서는 table과 rowSum, colSum, total등을 선언하고 이들을 조합하여 최종 출력 표를 작성했습니다.

이 문제에서는 2차원 배열 하나에 원래의 데이터와 가로 합, 세로 합, 총합을 모두 적어 넣는 방식으로 프로그램을 작성합니다.

실행 예

img

main 메소드에서는 아래와 같은 작업을 한다.

  • 우선 키보드로부터 2차원 데이터의 행 수와 열 수를 입력 받는다.
  • 입력 받은 행 수와 열 수보다 가로 세로가 하나씩 큰 2차원 배열을 구성한다. (가로 합과 세로 합을 추가하기 위해 가로 세로가 하나씩 큰 배열을 구성함)
  • 표의 데이터 부분에 난수를 채운다. (난수의 최대값이 얼마가 되게 할 것인지는 키보드로부터 입력 받아 정함)
  • 가로 합, 세로 합을 구해 표를 완성하고 출력한다.

아래와 같은 메소드들을 작성하고

main이 위 작업을 수행하기 위해 이 메소드들을 이용하도록 한다.

img

img

img

프로그램 뼈대

img


참고

배열 myArray의 크기는 myArray.length 이다.

이차원배열 table의 가로, 세로 크기는?

일차원 배열의 경우

int[] myArray = new int[5];

img

위 그림에서 myArray는 참조(reference)이다.

myArray.length 는 배열의 크기 (이 예에서는 5)이다.

아래 그림을 보세요. 제9주 강의자료에 있는 그림입니다.

img

이 그림으로부터 아래와 같이 생각할 수 있다.

table.length 행의 수

table[0].length 0번 행의 열 수

table[1].length 1번 행의 열 수


       

끝.