[Java의 정석 3판] chapter5 배열 연습 문제 (220116 기준 재확인 필요)
5-1. 다음은 배열을 선언하거나 초기화한 것이다. 잘못된 것을 고르고 그 이유를 설명하시오.
답 : d, e
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};
=> new int{1, 2, 3, 4, 5};
e. int arr[5];
=> int arr[];
f. int[] arr[] = new int[3][];
5-2. 다음과 같은 배열이 있을 때, arr[3].length의 값은 얼마인가?
답 : 2
int[][] arr = { { 5, 5, 5, 5, 5}, {10, 10, 10}, {20, 20, 20, 20}, {30, 30} };
5-3. 배열 arr에 담긴 모든 값을 더하는 프로그램을 완성하시오. (결과값 sum=150)
int[] arr = { 10, 20, 30, 40, 50 };
int sum = 0;
for(int i = 0; i < arr.length; i++) {
sum += arr[i];
}
System.out.println("sum=" + sum);
5-4. 2차원 배열 arr에 담긴 모든 값의 총합과 평균을 구하는 프로그램을 완성하시오. (값 : total=325, average=16.25)
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;
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++) {
total += arr[i][j];
}
}
average = total / (float)(arr.length * arr[0].length);
System.out.println("total="+total);
System.out.println("average="+average);
average값을 구하는 건 for문 바깥에다 써도, 안쪽에 써도 출력하는데 문제가 없다.
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;
tmp = ballArr[i];
ballArr[i] = ballArr[j];
ballArr[j] = tmp;
}
System.arraycopy(ballArr, 0, ball3, 0, 3);
for(int i=0;i<ball3.length;i++) {
System.out.print(ball3[i]);
}
System.arraycopy()를 써본 적이 없어서 헤맸다. (복사할 배열, 시작인덱스, 복사되는 배열, 시작인덱스, 길이)
5-6. 다음은 거스름돈을 몇 개의 동전으로 지불할 수 있는지를 계산하는 문제이다. 변수 money의 금액을 동전으로 바꾸었을 때 각각 몇 개의 동전이 필요한지 계산해서 출력하라.
단, 가능한 한 적은 수의 동전으로 거슬러 주어야한다. (1)에 알맞은 코드를 넣어서프로그램을 완성하시오.
[Hint] 나눗셈 연산자와 나머지 연산자를 사용해야 한다.
int[] coinUnit = {500, 100, 50, 10};
int money = 2680;
System.out.println("money="+money);
for(int i=0;i<coinUnit.length;i++) {
System.out.println(coinUnit[i] + "원 : " + money/coinUnit[i]);
System.out.println(money = money % coinUnit[i]);
}
System.out.println(money);
중간 나머지 연산자 넣어준게 이해가 안 가서 중간중간 출력문을 넣어보니 이해완료.. 왜 머리론 답이 안나올까
5-7. 풀 수 있을때 다시..
5-8. 다음은 배열 answer에 담긴 데이터를 읽고 각 숫자의 개수를 세어서 개수만큼 ‘*’을 찍어서 그래프를 그리는 프로그램이다. (1)~(2)에 알맞은 코드를 넣어서 완성하시오.
public static void main(String[] args) {
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]++;}
for(int i=0; i < counter.length;i++) {
System.out.print(counter[i]);
for(int j = 0; j < counter[i]; j++) {
System.out.print("*");
}
System.out.println();
}
}
8번 이해도 안가고 이 이상부터 도저히 ...........일단 계속 해보자
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++) {
int x = j;
int y = star.length-1-i;
result[x][y] = star[i][j];
}
}
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();
}
arraycopy를 써야되나 고민고민하다가 답지 보고도 이해 안가서 아이패드에 별 난리쳐가면서 겨우이해함
이렇게 어렵게 풀어야하는건가요^^
5-10. 다음은 알파벳과 숫자를 아래에 주어진 암호표로 암호화하는 프로그램이다. (1)에 알맞은 코드를 넣어서 완성하시오.
char[] abcCode =
{ '`','~','!','@','#','$','%','^','&','*',
'(',')','-','_','+','=','|','[',']','{',
'}',';',':',',','.','/'};
// 0 1 2 3 4 5 6 7 8 9
char[] numCode = {'q','w','e','r','t','y','u','i','o','p'};
String src = "abc123";
String result = "";
// 문자열 src의 문자를 charAt()으로 하나씩 읽어서 변환 후 result에 저장
for(int i=0; i < src.length();i++) {
char ch = src.charAt(i);
/*
(1) 알맞은 코드를 넣어 완성하시오.*/
if('a' <= ch && ch <= 'z') {
result += abcCode[ch - 'a'];
} else if('0' <= ch && ch <= '9') {
result += numCode[ch - '0'];
}
}
System.out.println("src:"+src);
System.out.println("result:"+result);
답안보고 이해했다.. 다시푼다면 풀 수 있겠지..
5-11. 봐도 모르겠다. 다음 기회에.....