Java

[Java] Java의 정석(기초편) 연습문제 풀이Chapter05

ab0utcom 2026. 1. 10. 22:30

5-1

다음은 배열을 선언하거나 초기화한 것이다. 잘못된 것과 그 이유를 설명하시오.

① int[] arr[];

② int[] arr = {1,2,3,};
③ int[] arr = new int[5];

④ int[] arr = new int[5]{1,2,3,4,5};
⑤ int arr[5];
⑥ int arr[] = new int[3][];

 

Ans) 4, 5, 6

 

Sol)

4: 이런식으로 써야 오류가 없지만, new int[크기]와 {}요소 초기화를 동시에 할 수 없다.

int[] arr = {1,2,3,4,5};
int[] arr = new int[]{1,2,3,4,5};

5: C/C++문법이고, Java에서는 배열 이름옆에 크기를 쓰지 않는다.

6: 일차원 배열로 선언했는데, 이차원배열의 문법을 쓰고 있다.


5-2

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

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

Ans) 2

Sol) arr[3] = {30, 30}이므로 length는 2다.


5-3

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

 

Sol)

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


public class Main
{
    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;

        int cnt = 0;
        for (int i=0; i<arr.length; i++) {
            for (int j=0; j<arr[i].length; j++) {
                total += arr[i][j];
                cnt++;
            }
        }
        average = (float) total / cnt;

        System.out.println("total=" + total);
        System.out.println("average=" + average);
    }
}

5-5

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

 

Sol)

public class Main
{
	public static void main(String[] args) {
		int[] ballArr = {1,2,3,4,5,6,7,8,9};
		int[] ball3 = new int[3];
		
		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;
		}
		
		ball3 = new int[]{ballArr[0], ballArr[1], ballArr[2]};
		
		for (int i=0; i<ball3.length; i++) {
		    System.out.print(ball3[i]);
		}
	}
}

ball3를 새로 선언한게 좀 불편하지만, 3줄 쓰긴 싫으니 이렇게 썼다.


5-6

단어의 글자위치를 섞어서 보여주고 원래의 단어를 맞추는 예제이다. 실행결과와 같이 동작하도록 예제의 빈 곳을 채우시오.

 

Sol)

import java.util.Scanner;
public class Main
{
	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();
		    
		    for (int j=0; j<question.length; j++) {
		        int k = (int)(Math.random()*(j-1));
		        
		        char tmp = question[j];
		        question[j] = question[k];
		        question[k] = tmp;
		    }
		    
		    System.out.printf("Q%d. %s의 정답을 입력하세요.>", i+1, new String(question));
		    
		    String answer = scanner.nextLine();
		    
		    if (words[i].equals(answer.trim()))
		        System.out.printf("맞았습니다.%n%n");
		    else
		        System.out.printf("틀렸습니다.%n%n");
		}
	}
}

문자열 섞는 shuffle알고리즘을 책 앞에서는

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

로 설명한다. 시간복잡도 O(N)의 괜찮은 방법같지만, 이 방법은 결과가 균등하지 않고 편향이 있다고 한다. 그래서 랜덤 인덱스 k를 문자열 전체까지가 아니라, 현재와 바꿀 예정인 인덱스보다 작은 영역에서 찾아야 한다.