본문 바로가기

Java의 정석 : 3rd Edition

[Java의 정석 - 연습문제] Chapter05. 배열(Array)

Java의 정석 : 3rd Edition, 2016을 개인 학습용으로 정리한 내용입니다.
"ppt 파일 자료, 연습문제"를 학습 용도로 배포할 수 있음을 고지하셨습니다.

저자님께 감사드립니다.

 

 

 

 

[5-1] 다음은 배열을 선언하거나 초기화한 것이다. 잘못된 것을 고르고 그 이유를 설명하시오.

a. int[] arr[];                                      // 타입에 썼는데, 변수이름에 또 썼다. 2차원 배열.

b. int[] arr = {1,2,3,};                        // 1,2,3을 저장하려면 3옆에 쉼표를 지워야 한다. (무방)

c. int[] arr = new int[5];

d. int[] arr = new int[5]{1,2,3,4,5};   // 대괄호[]안에 배열의 크기를 지정할 수 없다. 괄호 안의 데이터의 개수에 따라 자동적으로 결정되기 때문이다.

e. int arr[5];                                    // int arr[] = new int[5]; 배열의 크기는 new int[] 안에 작성해야 함.

f. int[] arr[] = new int[3][];                 // 가변 배열.

 

 

 

 

[5-2] 다음과 같은 배열이 있을 때, arr[3].length의 값은 얼마인가?

int[][] arr = {
	{5, 5, 5, 5, 5},
	{10, 10, 10},
	{20, 20, 20, 20},
	{30, 30}
};

 

나의 답 : 2     // {30, 30} → 1,2

 

 

 

 

[5-3] 배열 arr에 담긴 모든 값을 더하는 프로그램을 완성하시오.

class Exercise5_3 {
	public static void main(String[] args) {
		int[] arr = {10, 20, 30, 40, 50};
		int sum = 0;

		/*
			(1) 알맞은 코드를 넣어 완성하시오.
		*/
    
		System.out.println("sum="+sum);
	}
}

 

나의 답 : arr[i]의 값을 sum에 누적한다.

for (int i = 0; i < arr.length; i++) {
	sum += arr[i];
}

 

 

 

 

[5-4] 2차원 배열 arr에 담긴 모든 값의 총합과 평균을 구하는 프로그램을 완성하시오.

class Exercise5_4 {
	public static void main(String[] args) {
		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;

		/*
			(1) 알맞은 코드를 넣어 완성하시오.
		*/

		System.out.println("total="+total);
		System.out.println("average="+average);
	} // end of main
} // end of class
// total=325
// average=16.25

 

나의 답(오답) : 4명의 점수이므로 4명으로 나눴는데, 모든 값의 총합과 평균. 평균도 모든 값에 대한 평균을 물어본 문제.

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;
// total=325
// average=81.25

 

해설 : 평균을 구할 때 배열 모든 요소의 개수(25)를 total과 나누면 된다.

average = total / (float)(arr.length * arr[0].length);

 

 

 

 

[5-5] 다음은 1과 9사이의 중복되지 않은 숫자로 이루어진 3자리 숫자를 만들어내는 프로그램이다.

(1)~(2)에 알맞은 코드를 넣어서 프로그램을 완성하시오.

[참고] Math.random()을 사용했기 때문에 실행결과와 다를 수 있다.

class Exercise5_5 {
	public static void main(String[] args) {
		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]);
		}
	} // end of main
} // end of class
// 486

 

나의 답 :

1) 임의의 위치인 ballArr[j] 와 ballArr[i]의 위치를 바꿔가며 값을 섞는다.

2) 반복문으로 3개의 요소만 ball3[] 배열에 넣는다.

// 1)
tmp = ballArr[i];
ballArr[i] = ballArr[j];
ballArr[j] = tmp;

// 2)
for (int i = 0; i < 3; i++) {
	ball3[i] += ballArr[i];
}

 

해설 :

2) arraycopy()를 이용하여 ballArr[0]에서 3개의 데이터를 ball3[0]으로 복사한다.

System.arraycopy(ballArr, 0, ball3, 0, 3);

 

 

 

 

[5-6] 다음은 거스름돈을 몇 개의 동전으로 지불할 수 있는지를 계산하는 문제이다.

변수 money의 금액을 동전으로 바꾸었을 때 각각 몇 개의 동전이 필요한지 계산해서 출력하라.

단, 가능한 한 적은 수의 동전으로 거슬러 주어야한다.

(1)에 알맞은 코드를 넣어서 프로그램을 완성하시오.

[Hint] 나눗셈 연산자와 나머지 연산자를 사용해야 한다.

class Exercise5_6 {
	public static void main(String args[]) {
		// 큰 금액의 동전을 우선적으로 거슬러 줘야한다.
		int[] coinUnit = {500, 100, 50, 10};
       
		int money = 2680;
		System.out.println("money="+money);
        
		for(int i = 0; i < coinUnit.length; i++) {
			/*
				(1) 알맞은 코드를 넣어 완성하시오.
			*/
		}
	} // main
}
// money=2680
// 500원 : 5
// 100원 : 1
// 50원 : 1
// 10원 : 3

 

나의 답 : money의 값을 동전 단위 coinUnit[i]으로 나눈 후, 나머지 값을 다시 money에 저장한다.

* 지불할 동전의 개수 : money/coinUnit[i]

* 남은 금액 : money %= coinUnit[i];

System.out.printf("%d원: %d%n", coinUnit[i], money/coinUnit[i]);
money %= coinUnit[i];

 

 

 

 

[5-7] 문제 5-6에 동전의 개수를 추가한 프로그램이다.

커맨드라인으로부터 거슬러 줄 금액을 입력받아 계산한다.

보유한 동전의 개수로 거스름돈을 지불할 수 없으면, ‘거스름 돈이 부족합니다.’라고 출력하고 종료한다.

지불할 돈이 충분히 있으면, 거스름돈을 지불한 만큼 가진 돈에서 빼고 남은 동전의 개수를 화면에 출력한다.

(1)에 알맞은 코드를 넣어서 프로그램을 완성하시오.

class Exercise5_7 {
	public static void main(String args[]) {
		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) 아래의 로직에 맞게 코드를 작성하시오.
			    1. 금액(money)을 동전단위로 나눠서 필요한 동전의 개수(coinNum)를 구한다.
			    2. 배열 coin에서 coinNum만큼의 동전을 뺀다.
				   (만일 충분한 동전이 없다면 배열 coin에 있는 만큼만 뺀다.)
			    3. 금액에서 동전의 개수(coinNum)와 동전단위를 곱한 값을 뺀다.
			*/
            
			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]);
		}
	} // main
}

 

나의 답 :

1) 필요한 동전의 개수(coinNum)가 갖고 있는 동전의 개수(coin[i] = 5)보다 더 크다면 2번 과정에서 음수가 되므로,

갖고 있는 동전의 개수(coin[i] = 5)를 필요한 동전의 개수(coinNum)에 저장한다.

// 1. 금액(money)을 동전단위로 나눠서 필요한 동전의 개수(coinNum)를 구한다.
if (money/coinUnit[i] > coin[i]) {
	coinNum = coin[i];
} else {
	coinNum = money/coinUnit[i];
}

// 2. 배열 coin에서 coinNum만큼의 동전을 뺀다.
//    (만일 충분한 동전이 없다면 배열 coin에 있는 만큼만 뺀다.)
coin[i] -= coinNum;

// 3. 금액에서 동전의 개수(coinNum)와 동전단위를 곱한 값을 뺀다.
money -= coinNum * coinUnit[i];

 

해설 : 갖고 있는 동전의 개수가 필요한 동전의 개수 보다 크다면 그대로 뺄셈을 하고,

필요한 동전의 개수가 더 크면 갖고 있는 동전의 개수를 대입한 후 갖고 있는 동전의 개수를 0으로 저장한다.

// 1. 금액(money)을 동전단위로 나눠서 필요한 동전의 개수(coinNum)를 구한다.
coinNum = money/coinUnit[i];

// 2. 배열 coin에서 coinNum만큼의 동전을 뺀다.
//    (만일 충분한 동전이 없다면 배열 coin에 있는 만큼만 뺀다.)
if(coin[i] >= coinNum) {
	coin[i] -= coinNum;
} else {
	coinNum = coin[i];
	coin[i] = 0;
}

// 3. 금액에서 동전의 개수(coinNum)와 동전단위를 곱한 값을 뺀다.
// 동일

 

 

 

 

[5-8] 배열 answer에 담긴 데이터를 읽고 각 숫자의 개수를 세어 개수만큼 ‘*’을 찍어 그래프를 그리는 프로그램이다.

(1)~(2)에 알맞은 코드를 넣어서 완성하시오.

class Exercise5_8 {
	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++) {
			/* (1) 알맞은 코드를 넣어 완성하시오. */
		}

		for(int i = 0; i < counter.length; i++) {
			/*
				(2) 알맞은 코드를 넣어 완성하시오.
			*/
            
			System.out.println();
		}
	} // end of main
} // end of class
// 3***
// 2**
// 2**
// 4****

 

나의 답 :

1) answer[]에 저장된 값이 1부터 시작되므로 1을 빼야한다.

2) counter[]에 저장된 수를 출력 후 반복문으로 값만큼 '*'을 출력한다.

// counter[0] = 3(1의 개수), counter[1] = 2(2의 개수), counter[2] = 2(3의 개수), counter[3] = 4(4의 개수)

// 1)
counter[answer[i]-1]++;

// 2) 
System.out.print(counter[i]);
            
for (int j = 0; j < counter[i]; j++) {
	System.out.print("*");
}
System.out.println();

 

 

 

 

[5-9] 주어진 배열을 시계방향으로 90도 회전시켜서 출력하는 프로그램을 완성하시오.

class Exercise5_9 {
	public static void main(String[] args) {
		char[][] star = { // [4][5]
			{'*', '*', ' ', ' ', ' '},
			{'*', '*', ' ', ' ', ' '},
			{'*', '*', '*', '*', '*'},
			{'*', '*', '*', '*', '*'}
		};
        
		char[][] result = new char[star[0].length][star.length]; // [5][4]

		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();
		}
	} // end of main
} // end of class
// **
// **
// *****
// *****

// ****
// ****
// **
// **
// **

 

해설과 나의 생각 : 해설을 보고 정리한 내용입니다.

일정한 규칙을 찾아보려고 원본, 90도 회전한 값을 적은 후 각 요소의 값들을 나열했다.

 

result[x][ ]의 값(행)을 구하는 방법

1) 각 요소는 각각 0.0 > 0.3, 0.1 > 1.3, 0.2 > 2.3, 0.3 > 3.3, 0.4 > 4.3로 대입되어야 한다.

2) star[i][j], result[x][y]로 생각한다면, star[j]의 값(열)과 result[x]의 값(행)이 같음을 알 수 있다. (0 > 1 > 2 > 3 > 4)

3) result[x]에 star[j]의 값을 저장한다.

 

result[ ][y]의 값(열)을 구하는 방법

1) star[i]의 값(행)과 result[y]의 값(열)에는 일정한 규칙이 있는데, 서로를 더하면 항상 3이 된다. (0+3, 1+2, 2+1, 3+0)

2) i = 0이라면, 0(i)+3(y) 이다. 이는 star.length(4)에 1을 뺀 값(3)과 같다.

 2-1) i+y = star.length-1이니까, y = star.length-1-i라 할 수 있다.

        (처음에는 이 말이 단번에 이해되지 않았다. 보고 또 보다보니 수학의 치환임이 떠올랐다.)

 2-2) (왼쪽) = (오른쪽) : 우리는 행의 값(y)을 구해야 하므로 왼쪽에 있는 i의 값을 오른쪽으로 넘기면 i는 음수가 된다.

 2-3) i = 0일 때 y = 3, i = 1일 때 y = 2, i = 2일 때 y = 1, i = 3일 때 y = 0이 된다.

        y(3) = star.length(4)-1-i(0) > y(2) = star.length(4)-1-i(1) > y(1) = star.length(4)-1-i(2) > y(0) = star.length(4)-1-i(3)

 

+) i = 0일때, y에 어떤 식을 넣으면 3이 될까?를 생각하면 될 것 같다.

 ++) i = 0일때, star.length의 값이 4이니까 y에 넣어보니 배열의 크기가 [4]이므로 index의 값은 3. 즉, y는 3이어야 한다.

++) i = 0일때, y는 3이어야 하므로 star.length(4)-1로 3을 만들 수 있다.

++) i = 1일때, y는 2여야 하는데 star.length(4)-1는 고정된 3의 값이다.

++) i가 증가됨에 따라 star.length(4)-1에 빼야할 값도 증가되어야 한다.

++) i는 증가되는 값이다. star.length(4)-1에 i의 값을 빼보면 star.length(4)-1-i(1) > 4-1-1 > 2가 된다.

++) 그럼 이제 i = 2일때, y의 값은 star.length(4)-1-i(2) > 4-1-2 > 1이 된다. 

 

모양을 먼저 생각하니 막막했다. [i],[j]의 반복이 수행될 때 [x],[y]에 들어가야할 값을 표로 정리하는 습관을 들여야겠다.

[원본]                                   [90도 회전한 값]
0.0 0.1                                 0.0 0.1 0.2 0.3
1.0 1.1                                 1.0 1.1 1.2 1.3               
2.0 2.1 2.2 2.3 2.4               2.0 2.1               
3.0 3.1 3.2 3.3 3.4               3.0 3.1
                                            4.0 4.1
[i][j]   [x][y]              [i][j]   [x][y]              [i][j]   [x][y]        [i][j]   [x][y]
0.0 > 0.3 ('*')          1.0 > 0.2 ('*')          2.0 > 0.1          3.0 > 0.0
0.1 > 1.3 ('*')          1.1 > 1.2 ('*')          2.1 > 1.1          3.1 > 1.0
0.2 > 2.3 (' ')          1.2 > 2.2 (' ')          2.2 > 2.1          3.2 > 2.0
0.3 > 3.3 (' ')          1.3 > 3.2 (' ')          2.3 > 3.1          3.3 > 3.0
0.4 > 4.3 (' ')          1.4 > 4.2 (' ')          2.4 > 4.1          3.4 > 4.0

 

답 :

int x = j;
int y = star.length-i-1;

result[x][y] = star[i][j];
// 값이 저장되는 순서
i: 0, j: 0 = *
x: 0, y: 3 = *

i: 0, j: 1 = *
x: 1, y: 3 = *

i: 0, j: 2 =  
x: 2, y: 3 =  

i: 0, j: 3 =  
x: 3, y: 3 =  

i: 0, j: 4 =  
x: 4, y: 3 =  

i: 1, j: 0 = *
x: 0, y: 2 = *

i: 1, j: 1 = *
x: 1, y: 2 = *

i: 1, j: 2 =  
x: 2, y: 2 =  

i: 1, j: 3 =  
x: 3, y: 2 =  

i: 1, j: 4 =  
x: 4, y: 2 =  

i: 2, j: 0 = *
x: 0, y: 1 = *

i: 2, j: 1 = *
x: 1, y: 1 = *

i: 2, j: 2 = *
x: 2, y: 1 = *

i: 2, j: 3 = *
x: 3, y: 1 = *

i: 2, j: 4 = *
x: 4, y: 1 = *

i: 3, j: 0 = *
x: 0, y: 0 = *

i: 3, j: 1 = *
x: 1, y: 0 = *

i: 3, j: 2 = *
x: 2, y: 0 = *

i: 3, j: 3 = *
x: 3, y: 0 = *

i: 3, j: 4 = *
x: 4, y: 0 = *

 

 

 

 

[5-10] 다음은 알파벳과 숫자를 아래에 주어진 암호표로 암호화하는 프로그램이다.

(1)에 알맞은 코드를 넣어서 완성하시오.

암호표
암호표

class Exercise5_10 {
	public static void main(String[] args) {
		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) 알맞은 코드를 넣어 완성하시오.
			*/
        }
        
		System.out.println("src:"+src);
		System.out.println("result:"+result);
	} // end of main
} // end of class
// src:abc123
// result:`~!wer

 

나의 답 :

ch가 문자열('a'~'z')이면 'a'의 값은 유니코드 정수 값으로 49인데, 'a'의 값은 abcCode[0]에 위치하고 있으므로 'a'의 값을 빼서 숫자로 변환한다.

숫자('0'~'9')라면 '0'를 빼 숫자로 변환한다.

if ('a' <= ch && ch <= 'z') {
	result += abcCode[ch - 'a'];
} else if ('0' <= ch && ch <= '9') {
	result += numCode[ch - '0'];
}

 

 

 

 

[5-11] 주어진 2차원 배열의 데이터보다 가로와 세로로 1이 더 큰 배열을 생성해서

배열의 행과 열의 마지막 요소에 각 열과 행의 총합을 저장하고 출력하는 프로그램이다.

(1)에 알맞은 코드를 넣어서 완성하시오.

class Exercise5_11 {
	public static void main(String[] args) {
		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();
		}
	} // main
}
// 100 100 100 300
//  20  20  20  60
//  30  30  30  90
//  40  40  40 120
//  50  50  50 150
// 240 240 240 720

 

나의 답 :

1) 가로로 1이 더 큰 배열(0.3, 1.3, 2.3, 3.3, 4.3)에 저장할 값

 1-1) 행(i)은 순차적으로 증가(0 > 1 > 2 > 3 > 4)되도록 그대로 두고, 열(j)의 값은 3으로 고정되어야 한다.

 1-2) 열(j)의 값을 score[][]의 열의 값(3)을 저장한 y로 바꾼다.

2) 세로로 1이 더 큰 배열(5.0, 5.1, 5.2)에 저장할 값

 2-1) 열(j)은 순차적으로 증가(0 > 1 > 2)되도록 그대로 두고, 행(i)의 값은 5로 고정되어야 한다.

 2-2) 행(i)의 값을 score[][]의 행의 값(5)을 저장한 x로 바꾼다.

3) [5][3] : 배열 교차 부분(마지막 값 제외 0.0, 0.1, 0.2를 더한 값)

 3-1) 가로로 1이 더 큰 배열에 저장한 값(0.3, 1.3, 2.3, 3.3, 4.3)들을 더한 값을 저장하면 된다.

 3-2) 해당 코드를 맨 마지막에 작성했더니 세로로 1이 더 큰 배열에 저장한 값(5.0, 5.1, 5.2)도 더해졌다.

 3-3) 가로로 1이 더 큰 배열에 값을 저장하기 전으로 코드의 위치를 옮겼더니, (0.3 = 0.0, 0.1, 0.2)의 값이 더해졌다.

   제어변수 i로 인해 마지막 줄(5.0, 5.1, 5.2)이 계산되지 않았기 때문이다.

int x = score.length;           // 5
int y = score[i].length;        // 3

result[i][j] = score[i][j];     // result[][]에 score[][]의 값 넣기
result[x][y] += result[i][y];   // 3) [5][3] : 배열 교차 부분(마지막 값 제외 0.0, 0.1, 0.2를 더한 값)
result[i][y] += score[i][j];    // 1) 가로로 1이 더 큰 배열(0.3, 1.3, 2.3, 3.3...)에 저장할 값
result[x][j] += score[i][j];    // 2) 세로로 1이 더 큰 배열(5.0, 5.1, 5.2, 5.3...)에 저장할 값

 

 

해설 :

2차원 배열의 복사를 조금 응용한 문제이다.

1) result[][]의 맨 오른쪽 열에는 각 행의 총합 : [0][3], [1][3], [2][3], [3][3], [4][3]

2) result[][]의 맨 마지막 행에는 각 열의 총합 : [5][0], [5][1], [5][2]

3) result[][]의 맨 오른쪽 행의 마지막 열에는 전체 총합 : [5][3]

아.. result[][]의 값을 다시 result[][] 해당 열, 행에 넣는거구나..

// score[0].length : 3, score.length : 5
result[i][j] = score[i][j];
result[i][score[0].length] += result[i][j];             // [i][3]
result[score.length][j] += result[i][j];                // [5][j]
result[score.length][score[0].length] += result[i][j];  // [5][3]

식을 간단히 하기 위해 score[][]의 값을 사용했지만 이 둘은 동일한 값이다.

result.length-1 → score.length

result[0].length-1 → score[0].length

 

score[i][j]의 값을 result[i][j]에 저장하기 때문에 result[i][j] 대신 score[i][j]를 사용해도 같은 결과를 얻는다.

// score[0].length : 3, score.length : 5
result[i][j] = score[i][j];

// result[i][score[0].length] += result[i][j];             // [i][3]
// result[score.length][j] += result[i][j];                // [5][j]
// result[score.length][score[0].length] += result[i][j];  // [5][3]

result[i][score[0].length] += score[i][j];              // [i][3]
result[score.length][j] += score[i][j];                 // [5][j]
result[score.length][score[0].length] += score[i];      // [5][3]

 

 

 

 

[5-12] 예제 5-23을 변경하여, 아래와 같은 결과가 나오도록 하시오.

Q1. chair의 뜻은? dmlwk
틀렸습니다. 정답은 의자입니다.

Q2. computer의 뜻은? 컴퓨터
정답입니다.

Q3. integer의 뜻은? 정수
정답입니다.

전체 3문제 중 2문제 맞추셨습니다.

 

나의 답 : 예제 5-23에 답을 맞췄을 때 맞춘 횟수를 셀 count 변수를 추가한 형태이다.

답을 맞추면 count 값이 증가되며, 반복문이 끝난 후 퀴즈의 수와 count 값을 출력한다.

String[][] quiz = {
            {"chair", "의자"},
            {"computer", "컴퓨터"},
            {"integer", "정수"},
};

int count = 0;
Scanner scanner = new Scanner(System.in);

for (int i = 0; i < quiz.length; i++) {
	System.out.printf("Q%d. %s의 뜻은? ", i+1, quiz[i][0]);

	String input = scanner.nextLine();

	if (input.equals(quiz[i][1])) {
                System.out.println("정답입니다.");
                count++;
	} else {
                System.out.printf("틀렸습니다. 정답은 %s입니다.%n", quiz[i][1]);
	}
}
System.out.printf("전체 %d문제 중 %d문제 맞추셨습니다.", quiz.length, count);

 

 

 

 

[5-13] 단어의 글자위치를 섞어서 보여주고 원래의 단어를 맞추는 예제이다.

실행결과와 같이 동작하도록 예제의 빈 곳을 채우시오.

import java.util.Scanner;

class Exercise5_13 {
	public static void main(String args[]) {
		String[] words = {"television", "computer", "mouse", "phone"};
		
		Scanner scanner = new Scanner(System.in);

		for(int i = 0; i < words.length; i++) {
			char[] question = words[i].toCharArray(); // String을 char[]로 변환

			/*
				(1) 알맞은 코드를 넣어 완성하시오.
					char배열 question에 담긴 문자의 위치를 임의로 바꾼다.
			*/
			
			System.out.printf("Q%d. %s의 정답을 입력하세요.>", i+1, new String(question));
			
			String answer = scanner.nextLine();
            
			// trim()으로 answer의 좌우 공백을 제거한 후, equals로 word[i]와 비교
			if(words[i].equals(answer.trim()))
				System.out.printf("맞았습니다.%n%n");
			else
				System.out.printf("틀렸습니다.%n%n");
		}
	} // main의 끝
}

 

나의 답 : 반복문을 하나 더 만들어 question[j]의 값을 임의의 위치 값과 교환한다.

char[]의 각 요소는 char 타입이므로 임시 변수 tmp의 타입을 char로 해야 한다.

for (int j = 0; j < question.length; j++) {
    int random = (int) (Math.random() * question.length);

    char tmp = question[j];
    question[j] = question[random];
    question[random] = tmp;
}

 

해설 : question[] index의 값으로 j가 아닌 i를 사용했다.

j와 i의 값이 동일해서 i로 사용하신 건가? 이러면 j를 선언할 이유가 없지 않을까?하는 의구심이 든다.

for(int j = 0; j < question.length; j++) {
    int idx = (int)(Math.random() * question.length);
	
    char tmp = question[i];
    question[i] = question[idx];
    question[idx] = tmp;
}