자바의 정석 연습문제 ch5 배열
자바의 정석 3판 기초판 연습문제
https://github.com/castello/javajungsuk3
GitHub - castello/javajungsuk3: soure codes and ppt files of javajungsuk 3rd edition
soure codes and ppt files of javajungsuk 3rd edition - GitHub - castello/javajungsuk3: soure codes and ppt files of javajungsuk 3rd edition
github.com
[5-1] 다음은 배열을 선언하거나 초기화 한 것이다. 잘못된 것을 고르고 그 이유를 설명 하시오.
a. int[] arr[];
b. int[] arr = {1,2,3,};
c. int[] arr = new int[5];
d. int[] arr = new int[5]{1,2,3,4,5};
e. int arr[5];
f. int[] arr[] = new int[3][];
d → {}안에 있는 데이터만큼 배열 길이 설정 배열 길이 지정 불가
e → 선언과 동시에 배열 길이 지정 불가
[5-2] 다음과 같은 배열이 있을 때, arr[3].length의 값은 얼마인가?
int[][] arr = {
{ 5,5,5,5,5},
{ 10, 10, 10},
{ 20, 20, 20, 20},
{ 30, 30}
};
arr[3]. length 값 : 2 → {30, 30}
[5-3] 배열 arr에 담긴 모든 값을 더하는 프로그램을 완성하시오.
int[] arr = {10, 20, 30, 40, 50};
int sum = 0;
System.out.println("sum="+sum);
//실행 결과
sum = 150
for(int i = 0; i < arr.length; i++) {
sum += arr[i];
}
[5-4] 2차원 배열 arr에 담긴 모든 값의 총합과 평균을 구하는 프로그램을 완성하시오.
int[][] arr = {
{ 5, 5, 5, 5, 5},
{10,10,10,10,10},
{20,20,20,20,20},
{30,30,30,30,30}
};
int total = 0;
float average = 0;
System.out.println("total="+total);
System.out.println("average="+average);
// 실행결과
total = 325
average = 16.25
for(int i = 0; i<arr.length; i++) {
for(int j = 0; j <arr[i].length; j++) {
total += arr[i][j];
}
}
average = (float)total / (arr.length*arr[0].length);
[5-5] 다음은 1과 9사이의 중복되지 않은 숫자로 이루어진 3자리 숫자를 만들어내는 프 로그램이다. (1)~(2)에 알맞은 코드를 넣어서 프로그램을 완성하시오.
int[] ballArr = {1,2,3,4,5,6,7,8,9};
int[] ball3 = new int[3];
// 배열 ballArr의 임의의 요소를 골라서 위치를 바꾼다.
for(int i=0; i< ballArr.length;i++) {
int j = (int)(Math.random() * ballArr.length);
int tmp = 0;
// (1)
}
// 배열 ballArr의 앞에서 3개의 수를 배열 ball3로 복사한다.
// (2)
for(int i=0;i<ball3.length;i++) {
System.out.print(ball3[i]);
}
System.out.println();
(1)
tmp = ballArr[i]; // tmp에 임시저장
ballArr[i] = ballArr[j]; // i에 j값
ballArr[j] = ballArr[i]; // j에 tmp
(2)
System.arraycopy(ballArr, 0, ball3, 0, 3);
// arraycopy(복사항 배열, 복사할 배열 시작 위치, 복사본 담을 배열, 담을 배열 시작, 끝)
[5-6] 다음은 거스름돈을 몇 개의 동전으로 지불할 수 있는지를 계산하는 문제이다. 변 수 money의 금액을 동전으로 바꾸었을 때 각각 몇 개의 동전이 필요한지 계산해서 출력하 라. 단, 가능한 한 적은 수의 동전으로 거슬러 주어야한다. (1)에 알맞은 코드를 넣어서 프로그램을 완성하시오.
// 큰 금액의 동전을 우선적으로 거슬러 줘야한다.
int[] coinUnit = {500, 100, 50, 10};
int money = 2680;
System.out.println("money="+money);
for(int i=0;i<coinUnit.length;i++) {
(1)
}
System.out.println(coinUnit[i] + ": " + money/coinUnit[i]); // 개수 출력
money = money % coinUnit[i]; // 나머지
[5-7] 문제 5-6에 동전의 개수를 추가한 프로그램이다. 커맨드라인으로부터 거슬러 줄 금액을 입력받아 계산한다. 보유한 동전의 개수로 거스름돈을 지불할 수 없으면, ‘거스름 돈이 부족합니다.’라고 출력하고 종료한다. 지불할 돈이 충분히 있으면, 거스름돈을 지불 한 만큼 가진 돈에서 빼고 남은 동전의 개수를 화면에 출력한다. (1)에 알맞은 코드를 넣 어서 프로그램을 완성하시오.
if(args.length != 1) {
System.out.println("USAGE: java Exercise5_7 3120");
System.exit(0);
}
// 문자열을 숫자로 변환한다. 입력한 값이 숫자가 아닐 경우 예외가 발생한다.
int money = Integer.parseInt(args[0]);
System.out.println("money="+money);
int[] coinUnit = {500, 100, 50, 10 }; // 동전의 단위
int[] coin = {5, 5, 5, 5}; // 단위별 동전의 개수
for(int i=0;i<coinUnit.length;i++) {
int coinNum = 0;
//(1)
System.out.println(coinUnit[i]+"원: "+coinNum);
}
if(money > 0) {
System.out.println("거스름돈이 부족합니다.");
System.exit(0); // 프로그램을 종료한다.
}
System.out.println("=남은 동전의 개수 =");
for(int i=0;i<coinUnit.length;i++) {
System.out.println(coinUnit[i]+"원:"+coin[i]);
}
coinNum = money/coinUnit[i]; // 단위별 동전 개수
if(coin[i] >= coinNum) {
coin[i] -= coinNum; // 개수만큼 개수 뺌
} else {
coinNum = coin[i]; // 가지고 있는 개수보다 넘어가면 0으로 변
coin[i] = 0;
}
money -= coinUnit[i]*coinNum; //단위별 동전만큼 돈에서 뺌
[5-8] 다음은 배열 answer에 담긴 데이터를 읽고 각 숫자의 개수를 세어서 개수만큼 ‘*’ 을 찍어서 그래프를 그리는 프로그램이다. (1)~(2)에 알맞은 코드를 넣어서 완성하시오.
int[] answer = { 1,4,4,3,1,4,4,2,1,3,2 };
int[] counter = new int[4];
for(int i=0; i < answer.length;i++) {
//(1)
}
for(int i=0; i < counter.length;i++) {
//(2)
System.out.println();
}
int[] answer = { 1,4,4,3,1,4,4,2,1,3,2 };
int[] counter = new int[4];
for(int i=0; i < answer.length;i++) {
counter[answer[i]-1]++;
// answer[i]에 맞는 counter 1 증가 -> index에 맞춰 -1
}
for(int i=0; i < counter.length;i++) {
System.out.print(counter[i]);
for(int j=1; j <= counter[i]; j++) {
System.out.print("*");
}
System.out.println();
}
[5-9] 주어진 배열을 시계방향으로 90도 회전시켜서 출력하는 프로그램을 완성하시오.
char[][] star = {
{'*','*',' ',' ',' '}
, {'*','*',' ',' ',' '}
, {'*','*','*','*','*'}
, {'*','*','*','*','*'}
};
char[][] result = new char[star[0].length][star.length];
for(int i=0; i < star.length;i++) {
for(int j=0; j < star[i].length;j++) {
System.out.print(star[i][j]);
}
System.out.println();
}
System.out.println();
for(int i=0; i < star.length;i++) {
for(int j=0; j < star[i].length;j++) {
//(1)
}
}
for(int i=0; i < result.length;i++) {
for(int j=0; j < result[i].length;j++) {
System.out.print(result[i][j]);
}
System.out.println();
}
//실행결과
/*
**
**
*****
*****
****
****
**
**
**
*/
// s[0][0] -> r[0][3]
int a = j;
int b = star.length-1-i;
result[a][b] = star[i][j];
[5-11] 주어진 2차원 배열의 데이터보다 가로와 세로로 1이 더 큰 배열을 생성해서 배열 의 행과 열의 마지막 요소에 각 열과 행의 총합을 저장하고 출력하는 프로그램이다. (1) 에 알맞은 코드를 넣어서 완성하시오.
int[][] score = {
{100, 100, 100}
,{20, 20, 20}
,{30, 30, 30}
,{40, 40, 40}
,{50, 50, 50}
};
int[][] result = new int[score.length+1][score[0].length+1];
for(int i = 0; i < score.length; i++) {
for(int j = 0; j < score[i].length; j++) {
// (1)
}
}
for(int i = 0; i < result.length; i++) {
for(int j = 0; j < result[i].length; j++) {
System.out.printf("%4d", result[i][j]);
}
System.out.println();
}
// result에 score 넣어주기
result[i][j] = score[i][j];
// 마지막줄 합계
result[result.length-1][j] += score[i][j];
// 왼쪽 합계
result[i][result[0].length-1] += score[i][j];
// 왼쪽 전체 합계
result[result.length-1][result[0].length-1] += score[i][j];
[5-13] 단어의 글자위치를 섞어서 보여주고 원래의 단어를 맞추는 예제이다. 실행결과와 같이 동작하도록 예제의 빈 곳을 채우시오.
String[] words = { "television", "computer", "mouse", "phone"};
Scanner sc = new Scanner(System.in);
for(int i = 0; i < words.length; i++) {
char[] question = words[i].toCharArray(); // string을 char로 변환
//(1)
System.out.printf("Q%d. %s의 정답을 입력하세요.>", i+1, new String(question));
String answer = sc.nextLine();
// trim으로 answer의 좌우 공백 제거 후 equals로 words[i]와 비교
if(words[i].equals(answer.trim()))
System.out.printf("맞았습니다.%n%n");
else
System.out.printf("틀렸습니다.%n%n");
}
for(int j = 0; j < question.length; j++) {
// 랜덤 숫자
int num = (int)(Math.random() * question.length);
// 임시저장
char tmp = question[i];
// 서로 변경
question[i] = question[num];
question[num] = tmp;
}