minghxx.blog
  • 자바의 정석 연습문제 ch5 배열
    2023년 08월 31일 07시 33분 43초에 업로드 된 글입니다.
    작성자: 민발자
    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
    댓글