[출처] 자바의 정석 3판 연습문제 Chapter 5

 

 

[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

해설) d. int[] arr = new int[]{1,2,3,4,5} 에서는 대괄호[] 안에 배열의 크기를 지정할

수 없다 괄호 안의 데이터의 개수에 따라 자동적으로 결정되기 때문이다 .

 

 

5-5)  다음은 1과 9사이의 중복되지 않은 숫자로 이루어진 3자리 숫자를 만들어내는 프로그램이다. (1)~(2) 에 알맞은 코드를 넣어서 프로그램을 완성하시오 . 

 
내 작성 답안)
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)번 
		tmp = ballArr[i];
		ballArr[i]= ballArr[j];
		ballArr[j]= tmp;
		//
        
		}
        
        // 배열 ballArr의 앞에서 3개의 수를 배열 Ball3로 복사한다.
        // (2)번
		for(int i=0; i<3; i++) {
			ball3[i] = ballArr[i];
		}
		//
        
		for(int i=0;i<ball3.length;i++) {
		System.out.print(ball3[i]);
		}
    }
}

 

 

5-11) 주어진 차원 배열의 데이터보다 가로와 세로로 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
}

 

 

답안)

for(int i=0; i < score.length;i++) {
	for(int j=0; j < score[i].length;j++) {
		result[i][j] = score[i][j];
		result[i][score[0].length] += result[i][j];
		result[score.length][j] += result[i][j];
		result[score.length][score[0].length] += result[i][j];
	}
}

처음 3줄의 코드 작성 아이디어는 잘 떠올랐는데

마지막줄, 그러니까 배열의 가장 마지막 행의 마지막 열 값을 만드려면 반복문 안에서 어떻게 코드를 작성해야 하는지 많이 헤멨다.

 

내가 작성한 답안은 이랬다.

for(int i=0; i < score.length;i++) {
	for(int j=0; j < score[i].length;j++) {
		result[i][j] = score[i][j];
		result[i][score[i].length] += result[i][j];
		result[score.length][j] += result[i][j];
	}
    result[score.length][score[i].length] += result[i][score[i].length];
}

 

모범답안은 그냥 심플하게 모든 배열의 수를 그대로 다 더해줬는데

나는 새로 추가된 수들을 이용해서 만들어야 된다는 생각밖에 들지 않아서

결국 새로 추가된 result[i][score[i].length] 를 더해주는 방법을 고심하다가 겨우 찾게 되었는데

정답을 보니 좀 허무하긴 했다.

 

 

나는 직감적으로 코드가 떠오르지 않으면 많이 헤메게 된다.

직감에만 의존하는건 아무래도 그냥 때려맞추는 느낌이라 장기적으로 전혀 도움이 되지 않는 것 같다.

 

자꾸 논리적으로 생각하고 손으로 써보기도 하면서 반복문의 반복횟수(i와 j)와 내가 구하고자 하는 결과와의 관계식을

세우려는 방향으로 연습을 해야 할 것 같다.

 


[출처] 자바의 정석 3판 연습문제 Chapter 5

 

+ Recent posts