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를 문자열 전체까지가 아니라, 현재와 바꿀 예정인 인덱스보다 작은 영역에서 찾아야 한다.
'Java' 카테고리의 다른 글
| [Java] Java의 정석(기초편) 연습문제 풀이Chapter04 (0) | 2026.01.09 |
|---|---|
| [Java] Java의 정석(기초편) 연습문제 풀이Chapter03 (0) | 2026.01.08 |
| [Java] Java의 정석(기초편) 연습문제 풀이Chapter02 (0) | 2026.01.07 |