본문 바로가기
개념

[JAVA의 정석] Chapter05_연습문제

by cook_code 2024. 12. 8.

 

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

1.int[] arr[];

2.int[] arr = {1,2,3,};

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

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

5.int arr[5];

6.int arr[] = new int[3][];

 

답 : 4,5


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

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

답 : 2


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

 

답 :

public class Exercise5_3 {
	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] 2차원 배열 arr에 담긴 모든 값의 총합과 평균을 구하는 프로그램을 완성하시오.

 

답 :

public 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;

		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 * arr[0].length);

		System.out.println("total="+total); // 결과 : total=325
		System.out.println("average="+average); // 결과 : average=16.25
	}
}

 


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

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

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

 

답 :

public 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;
            tmp = ballArr[i];
            ballArr[i] = ballArr[j];
            ballArr[j] = tmp;
            // 배열 ballArr의 앞에서 3개의 수를 배열 ball3로 복사
        }

        System.arraycopy(ballArr, 0, ball3, 0, 3);
        for (int i = 0; i < ball3.length; i++) {
            System.out.print(ball3[i]);
        }
        System.out.println();
    }
}
 

풀이

  1. 배열 선언 및 초기화
    1. ballArr : 1-9까지의 정수 포함
    2. ball3 : 크기가 3인 정수 배열
  2. 배열 요소의 무작위 섞기
    1. Math.random() * ballArr.length는 0부터 ballArr.length - 1 사이의 무작위 인덱스를 생성
    2. 임의의 인덱스 j와 현재 인덱스 i의 요소를 교환하여 배열을 무작위로 섞음
    3. 임시 변수 tmp를 사용하여 두 요소를 교환
  3. 섞인 배열의 앞 3개의 숫자를 복사
    1. System.arraycopy를 사용해 ballArr의 시작 위치(인덱스 0)부터 3개의 요소를 ball3 배열로 복사
 

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

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

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

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

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

 

답 :

public 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++) {
            System.out.println(coinUnit[i]+"원: "+money/coinUnit[i]);
            money = money%coinUnit[i];
        }
    }
}
 
 

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

커맨드라인으로부터 거슬러 줄 금액을 입력받아 계산한다. 보유한 동전의 개수로 거스름돈을 지불할 수 없으면, ‘거스름 돈이 부족합니다.’라고 출력하고 종료한다. 지불할 돈이 충분히 있으면, 거스름돈을 지불한 만큼 가진 돈에서 빼고 남은 동전의 개수를 화면에 출력한다.

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

 

답 :

public 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 = money / coinUnit[i]; // 필요한 동전의 개수

            if (coin[i] < coinNum) { // 충분한 동전이 없는 경우
                coinNum = coin[i]; // 가지고 있는 동전만 사용
            }

            coin[i] -= coinNum; // 사용한 동전 개수만큼 뺀다
            money -= coinNum * coinUnit[i]; // 금액에서 해당 동전 사용한 만큼 뺀다

            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]);
        }
    }
}
 
money=3170
500원: 5
100원: 5
50원: 3
10원: 2
=남은 동전의 개수 =
500원:0
100원:0
50원:2
10원:3

Process finished with exit code 0
 

참고

코드 작성 후 실행 시 다음과 같은 에러가 발생하며 프로그램이 종료되었다.

java Exercise5_7 3120
 

적절한 값을 입력받지 못하는 문제로 주어진 코드에서 값을 입력받는 부분이 어딘지 몰라 생긴 에러였다.

인텔리제이 IDEA에서 인자 설정 방법

1. 메뉴에서 Run -> Edit Configurations...로 이동

2. 왼쪽 패널에서 해당 실행 설정을 선택

3. Configuration 탭에서 Program arguments 필드에 3120과 같은 값을 입력

4. Apply 또는 OK를 클릭

5. 프로그램을 다시 실행

출처 입력

이런 식으로 실행 시 Program arguments 인자값을 주면 원하는 값을 바로 넣어 코드를 실행 할 수 있다.

 

[5-8] 다음은 배열 answer에 담긴 데이터를 읽고 각 숫자의 개수를 세어서

개수만큼 ‘*’ 을 찍어서 그래프를 그리는 프로그램이다.

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

 

답 :

public 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]; // 각 숫자별 개수
        int count = 0;

        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();
        }
    }
}
 

풀이

//배열 초기화

int[] answer = {1, 4, 4, 3, 1, 4, 4, 2, 1, 3, 2};
int[] counter = new int[4]; // 각 숫자별 개수
// answer 배열: 1부터 4까지의 숫자로 구성
// counter 배열: 각 숫자의 개수를 세기 위해 사용, 인덱스 0부터 3까지 각각 숫자 1부터 4까지의 빈도를 저장
숫자 빈도 계산

for (int i = 0; i < answer.length; i++) {
    counter[answer[i] - 1]++;
}
// for 루프를 통해 answer 배열의 각 요소를 순회하면서 해당 숫자의 빈도를 증가시킴
// 예: answer[i]가 1일 경우, counter[0]을 증가시킴. 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();
}
// 첫 번째 for 루프: counter 배열의 각 요소를 순회
// System.out.print(counter[i]);: 현재 숫자의 빈도를 출력
// 두 번째 for 루프: 빈도수만큼 별표(*)를 출력
// System.out.println();: 줄바꿈을 추가하여 다음 숫자의 빈도와 별표를 새로운 줄에 출력
 
 

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

 

답 :

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

풀이

// 배열 초기화

char[][] star = {
        {'*', '*', ' ', ' ', ' '},
        {'*', '*', ' ', ' ', ' '},
        {'*', '*', '*', '*', '*'},
        {'*', '*', '*', '*', '*'}
};
char[][] result = new char[star[0].length][star.length];
// star 배열은 4x5 크기의 2차원 배열로, 별(*)과 공백( ) 문자로 구성되어 있음.
// result 배열은 star 배열을 90도 회전하여 저장할 5x4 크기의 2차원 배열.

//원본 배열 출력
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();
}

/* 이 루프는 star 배열의 모든 요소를 출력하여 원본 배열을 화면에 표시.
각 행을 출력한 후 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];
    }
}
/* 이 루프는 star 배열을 90도 회전시켜 result 배열에 저장
x = j;와 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();
}

// 이 루프는 result 배열의 모든 요소를 출력하여 회전된 배열을 화면에 표시
// 각 행을 출력한 후 System.out.println();을 사용하여 줄바꿈
 
 

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

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

사진 삭제

사진 설명을 입력하세요.

 

답 :

public 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);
            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);
    }
}
 

풀이

// 배열 초기화
char[] abcCode =
        {'`', '~', '!', '@', '#', '$', '%', '^', '&', '*',
                '(', ')', '-', '_', '+', '=', '|', '[', ']', '{',
                '}', ';', ':', ',', '.', '/'};
char[] numCode = {'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'};

/* 
abcCode 배열은 소문자 알파벳에 대응하는 특수 문자를 정의
numCode 배열은 숫자 0-9에 대응하는 문자를 정의 */

// 문자열과 결과 변수 초기화
String src = "abc123";
String result = "";

/* 
src 문자열은 변환할 원본 문자열
result 문자열은 변환된 결과를 저장
*/

// 문자 변환 루프
for (int i = 0; i < src.length(); i++) {
    char ch = src.charAt(i);
    if('a' <= ch && ch <='z') {
        result += abcCode[ch-'a'];
    } else if('0' <= ch && ch <='9') {
        result += numCode[ch-'0'];
    }
}

/* 
for 루프를 사용해 src 문자열의 각 문자 처리
char ch = src.charAt(i);로 현재 문자를 읽음
if 문을 통해 문자가 소문자 알파벳인지 확인
알파벳이면 abcCode[ch - 'a']로 변환
else if 문을 통해 문자가 숫자인지 확인
숫자이면 numCode[ch - '0']로 변환
변환된 문자를 result에 추가 
결과 출력 */

System.out.println("src:" + src);
System.out.println("result:" + result);
// 변환 전의 원본 문자열과 변환 후의 결과 문자열을 출력
 

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

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

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

 

답 :

public 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++) {
                result[i][j] = score[i][j];
                result[i][score[i].length] += score[i][j]; // 행의 총합
                result[score.length][j] += score[i][j];    // 열의 총합
                result[score.length][score[i].length] += score[i][j]; // 전체 총합
            }
        }
        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();
        }
    }
}
 

풀이

// 배열 초기화
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];

// score 배열은 5x3 크기의 2차원 배열로 각 학생의 점수를 저장
// result 배열은 6x4 크기의 2차원 배열로 각 행과 열의 합계를 저장할 공간 추가

// 데이터 복사 및 합계 계산
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] += score[i][j]; // 행의 총합
        result[score.length][j] += score[i][j];    // 열의 총합
        result[score.length][score[i].length] += score[i][j]; // 전체 총합
    }
}

// 이중 for 루프를 사용해 score 배열의 데이터를 result 배열에 복사
// result[i][score[i].length]에 각 행의 합계를 계산해 저장
// result[score.length][j]에 각 열의 합계를 계산해 저장
// result[score.length][score[i].length]에 전체 합계를 계산해 저장

// 결과 출력
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();
}

// 이중 for 루프를 사용해 result 배열의 모든 요소를 출력
 
 

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

 

Q1. chair의 뜻은? dmlwk

틀렸습니다. 정답은 의자입니다.

 

Q2. computer의 뜻은? 컴퓨터

정답입니다.

 

Q3. integer의 뜻은? 정수

정답입니다.

 

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

 

답 :

import java.util.Scanner;

public class Exercise5_12 {
    public static void main(String args[]) {
        String[][] words = {
                {"chair", "의자"}, // words[0][0], words[0][1]
                {"computer", "컴퓨터"}, // words[1][0], words[1][1]
                {"integer", "정수"} // words[2][0], words[2][1]
        };
        int score = 0; // 맞춘 문제의 수를 저장하기 위한 변수
        Scanner scanner = new Scanner(System.in);
        for (int i = 0; i < words.length; i++) {
            System.out.printf("Q%d. %s의 뜻은?", i + 1, words[i][0]);
            String tmp = scanner.nextLine();
            if (tmp.equals(words[i][1])) {
                System.out.printf("정답입니다.%n%n");
                score++;
            } else {
                System.out.printf("틀렸습니다. 정답은 %s입니다.%n%n", words[i][1]);
            }
        } // for
        System.out.printf("전체 %d문제 중 %d문제 맞추셨습니다.%n",
                words.length, score);
    }
}
 
Q1. chair의 뜻은? qkq
틀렸습니다. 정답은 의자입니다.

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

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

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

Process finished with exit code 0
 
 

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

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

Q1. lvtsieeoin의 정답을 입력하세요.>television

맞았습니다.

Q2. otepcumr의 정답을 입력하세요.>computer

맞았습니다.

Q3. usemo의 정답을 입력하세요.>asdf

틀렸습니다.

Q4. ohpne의 정답을 입력하세요.>phone

맞았습니다.

 

답 :

import java.util.Scanner;

public 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[]로 변환
            for(int j = 0; j < question.length; j++) {
                int idx = (int)(Math.random() * question.length);
                char tmp = question[j];
                question[j] = question[idx];
                question[idx] = tmp;
            }
            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");
        }
    }
}
 

풀이

// 배열 초기화 및 스캐너 생성
String[] words = { "television", "computer", "mouse", "phone" };
Scanner scanner = new Scanner(System.in);

/*
words 배열에는 맞추어야 할 단어들이 저장
scanner는 사용자 입력을 받기 위해 생성
*/

//단어를 섞기 위한 반복문
for(int i = 0; i < words.length; i++) {
    char[] question = words[i].toCharArray(); // String을 char[]로 변환
    // 단어를 섞기 위해 두 문자 위치를 바꾸는 방식
    for(int j = 0; j < question.length; j++) {
        int idx = (int)(Math.random() * question.length);
        char tmp = question[j];
        question[j] = question[idx];
        question[idx] = tmp;
    }
//words 배열을 순회하며 각 단어를 char 배열로 변환
//내부 for 루프를 사용해 각 문자의 위치를 무작위로 섞음

//문제 출력 및 사용자 입력 받기
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");
}
// trim()으로 사용자 입력의 좌우 공백 제거 후 정답과 비교
// 맞으면 "맞았습니다.", 틀리면 "틀렸습니다." 출력

//스캐너 닫기
scanner.close();

// 스캐너를 닫아 자원 해제
 

 

 

 

 

반응형