정리/Java

자바의 정석 연습문제 ch5 배열

민발자 2023. 8. 31. 07:33
728x90

자바의 정석 3판 기초판 연습문제

https://github.com/castello/javajungsuk3

 

GitHub - castello/javajungsuk3: soure codes and ppt files of javajungsuk 3rd edition

soure codes and ppt files of javajungsuk 3rd edition - GitHub - castello/javajungsuk3: soure codes and ppt files of javajungsuk 3rd edition

github.com

[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 → 선언과 동시에 배열 길이 지정 불가

 

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

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

arr[3]. length 값 : 2  {30, 30}

 

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

int[] arr = {10, 20, 30, 40, 50};
int sum = 0;

System.out.println("sum="+sum);

//실행 결과
sum = 150
for(int i = 0; i < arr.length; i++) {
	sum += arr[i];
}

 

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

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;

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

// 실행결과
total = 325
average = 16.25
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);

 

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

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

System.out.println();
(1)
tmp = ballArr[i]; // tmp에 임시저장
ballArr[i] = ballArr[j]; // i에 j값
ballArr[j] = ballArr[i]; // j에 tmp

(2)		
System.arraycopy(ballArr, 0, ball3, 0, 3);
// arraycopy(복사항 배열, 복사할 배열 시작 위치, 복사본 담을 배열, 담을 배열 시작, 끝)

 

[5-6] 다음은 거스름돈을 몇 개의 동전으로 지불할 수 있는지를 계산하는 문제이다. 변 수 money의 금액을 동전으로 바꾸었을 때 각각 몇 개의 동전이 필요한지 계산해서 출력하 라. 단, 가능한 한 적은 수의 동전으로 거슬러 주어야한다. (1)에 알맞은 코드를 넣어서 프로그램을 완성하시오.

// 큰 금액의 동전을 우선적으로 거슬러 줘야한다.
int[] coinUnit = {500, 100, 50, 10};

int money = 2680;
System.out.println("money="+money);

for(int i=0;i<coinUnit.length;i++) {
    (1)
}
System.out.println(coinUnit[i] + ": " + money/coinUnit[i]); // 개수 출력
money = money % coinUnit[i]; // 나머지

 

 

[5-7] 문제 5-6에 동전의 개수를 추가한 프로그램이다. 커맨드라인으로부터 거슬러 줄 금액을 입력받아 계산한다. 보유한 동전의 개수로 거스름돈을 지불할 수 없으면, ‘거스름 돈이 부족합니다.’라고 출력하고 종료한다. 지불할 돈이 충분히 있으면, 거스름돈을 지불 한 만큼 가진 돈에서 빼고 남은 동전의 개수를 화면에 출력한다. (1)에 알맞은 코드를 넣 어서 프로그램을 완성하시오.

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)

    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]);
}
coinNum = money/coinUnit[i]; // 단위별 동전 개수
			
if(coin[i] >= coinNum) {
    coin[i] -= coinNum; // 개수만큼 개수 뺌
} else {
    coinNum = coin[i]; // 가지고 있는 개수보다 넘어가면 0으로 변
    coin[i] = 0;
}

money -= coinUnit[i]*coinNum; //단위별 동전만큼 돈에서 뺌

 

[5-8] 다음은 배열 answer에 담긴 데이터를 읽고 각 숫자의 개수를 세어서 개수만큼 ‘*’ 을 찍어서 그래프를 그리는 프로그램이다. (1)~(2)에 알맞은 코드를 넣어서 완성하시오.

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();
}
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++) {
    counter[answer[i]-1]++;
    // answer[i]에 맞는 counter 1 증가 -> index에 맞춰 -1
}

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

 

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

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


//실행결과 
/*
    **
    ** 
    ***** 
    *****

    ****
    ****
    **
    **
    **
*/
// s[0][0] -> r[0][3]
int a = j;
int b = star.length-1-i; 
				
result[a][b] = star[i][j];

 

[5-11] 주어진 2차원 배열의 데이터보다 가로와 세로로 1이 더 큰 배열을 생성해서 배열 의 행과 열의 마지막 요소에 각 열과 행의 총합을 저장하고 출력하는 프로그램이다. (1) 에 알맞은 코드를 넣어서 완성하시오.

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();
}
// result에 score 넣어주기
result[i][j] = score[i][j];

// 마지막줄 합계
result[result.length-1][j] += score[i][j]; 

// 왼쪽 합계
result[i][result[0].length-1] += score[i][j];

// 왼쪽 전체 합계
result[result.length-1][result[0].length-1] += score[i][j];

 

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

String[] words = { "television", "computer", "mouse", "phone"};
		
Scanner sc = new Scanner(System.in);

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

    //(1)

    System.out.printf("Q%d. %s의 정답을 입력하세요.>", i+1, new String(question));

    String answer = sc.nextLine();

    // trim으로 answer의 좌우 공백 제거 후 equals로  words[i]와 비교
    if(words[i].equals(answer.trim()))
        System.out.printf("맞았습니다.%n%n");
    else 
        System.out.printf("틀렸습니다.%n%n");
}
for(int j = 0; j < question.length; j++) {
    // 랜덤 숫자
    int num = (int)(Math.random() * question.length);
    // 임시저장
    char tmp = question[i];

    // 서로 변경
    question[i] = question[num];
    question[num] = tmp;
}
728x90