본문 바로가기
Algorithm/Do it 자료구조와 함께 배우는 알고리즘 입문

[Algorithm] Chapter02 연습문제 Q1~Q7

by 준그래머 2021. 3. 31.
반응형

Q1 키뿐만 아니라 사람 수도 난수로 생성하도록 실습 2-5를 수정하여 프로그램을 작성하시오.

import java.util.Random;

public class Chap_02_q_01_tallest {
    public static void main(String[] args) {
        Random random = new Random();

        System.out.println("키의 최댓값을 구합니다.");
        System.out.print("사람 수: ");
        int num = random.nextInt(10)+1;

        int[] height = new int[num];
        System.out.println("키 값은 아래와 같습니다.");
        for(int i = 0; i < num; i++){
            height[i] = 100 + random.nextInt(90);
            System.out.println("height[" + i + "]: " + height[i]);
        }

        System.out.println("최댓값은 " + maxOf(height) + "입니다.");

    }

    private static int maxOf(int[] height) {
        int max = height[0];
        for(int i = 1; i < height.length; i++){
            if(max < height[i]) max = height[i];
        }
        return max;
    }
}

 

 

Q2 오른쪽처럼 배열 요소를 역순으로 정렬하는 과정을 하나하나 나타내는 프로그램을 작성하시오.

5, 10 73, 2, -5, 42
a[0]과 a[5]를 교환합니다.
42 10, 73, 2 ,-5, 5
a[1]과 a[4]를 교환합니다.
42 -5, 73, 2 ,10, 5
a[2]과 a[3]를 교환합니다.
42 -5, 2, 73 ,10, 5
역순 정렬을 마쳤습니다.
import java.util.Random;

public class Chap02_q2_reverse {
    public static void main(String[] args) {
        Random random = new Random();

        int[] arr = new int[random.nextInt(10)+1];

        for(int i = 0; i < arr.length; i++){
            arr[i] = random.nextInt(100);
            if(i!= arr.length-1) System.out.printf("%2d, ", arr[i]);
            else System.out.printf("%2d", arr[i]);
        }
        System.out.println();
        reverseSort(arr);
    }

    private static void reverseSort(int[] arr) {
        int start = 0;
        int end = arr.length-1;
        do{
            System.out.println("a[" + start + "]과 a[" + end + "]를 교환합니다.");
            int tmp = arr[start];
            arr[start] = arr[end];
            arr[end] = tmp;
            start++;
            end--;
            for(int i = 0; i < arr.length; i++){
                if(i!= arr.length-1) System.out.printf("%2d, ", arr[i]);
                else System.out.printf("%2d", arr[i]);
            }
            System.out.println();
        }while(start < end);

        System.out.println("역순 정렬을 마쳤습니다.");
    }
}

 

 

Q3 배열 a의 모든 요소의 합계를 구하여 반환하는 메서드를 작성하세요.

static int sumOf(int[] a)

 

import java.util.Random;

public class Chap02_q3_sumOf {
    public static void main(String[] args) {
        Random random = new Random();

        int[] arr = new int[random.nextInt(10)+1];

        for(int i = 0; i < arr.length; i++){
            arr[i] = random.nextInt(100);
            if(i!= arr.length-1) System.out.printf("%2d, ", arr[i]);
            else System.out.printf("%2d", arr[i]);
        }
        System.out.println();
        System.out.println("총 합은 " + sumOf(arr) + "입니다.");
    }

    private static int sumOf(int[] arr) {
        int sum = 0;
        for(int num : arr){
            sum += num;
        }
        return sum;
    }
}

 

 

Q4 배열 b의 모든 요소를 배열 a에 복사하는 메서드 copy를 작성하세요.

static void copy(int [] a, int [] b)

 

import java.util.Arrays;
import java.util.Random;

public class Chap02_q4_copyb {
    public static void main(String[] args) {
        Random random = new Random();

        int size = random.nextInt(10)+1;

        int[] a = new int[size];
        int[] b = new int[size];

        for(int i = 0; i < b.length; i++){
            b[i] = random.nextInt(100);
            if(i!= b.length-1) System.out.printf("%2d, ", b[i]);
            else System.out.printf("%2d", b[i]);
        }
        System.out.println();
        copy(a, b);
    }

    private static void copy(int[] a, int[] b) {
        for(int i = 0; i < b.length; i++){
            a[i] = b[i];
        }
        System.out.println("a: " + Arrays.toString(a));
    }
}

 

 

Q5 배열 b의 모든 요소를 배열 a에 역순으로 복사하는 메서드 rcopy를 작성하세요.

static void rcopy(int[] a, int[] b)

 

import java.util.Arrays;
import java.util.Random;

public class Chap02_q5_rcopy {
    public static void main(String[] args) {
        Random random = new Random();

        int size = random.nextInt(10)+1;

        int[] a = new int[size];
        int[] b = new int[size];

        for(int i = 0; i < b.length; i++){
            b[i] = random.nextInt(100);
            if(i!= b.length-1) System.out.printf("%2d, ", b[i]);
            else System.out.printf("%2d", b[i]);
        }
        System.out.println();
        rcopy(a, b);
    }

    private static void rcopy(int[] a, int[] b) {
        for(int i = b.length-1; i > -1; i--){
            a[b.length - (i + 1)] = b[i];
        }
        System.out.println("a: " + Arrays.toString(a));
    }
}

 

Q6 배열의 앞쪽에 아랫자리가 아니라 윗자리를 넣어두는 메서드를 작성하세요.

static int cardConv(int x, int r, char[] d)

 

import java.util.Scanner;

public class Chap_q6_cardConv {

    private final static int alphaPos = 65; // 알파벳 'A'가 시작하는 ASCII 코드 위치
    private final static int numberAmount = 10; // 숫자 갯수

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int dno = 0; // 변환 후 자릿 수
        int no = 0; // 변환하는 정수
        int cd = 0; // 기수
        int retry = 0; // 다시 한번?
        char[] cno = new char[32]; // 변환 후 각 자리의 숫자를 넣어두는 문자의 배열
        System.out.println("10진수를 기수 변환합니다.");

        do{
            clear(cno, dno);
            do{
                System.out.print("변환하는 음이 아닌 정수: ");
                no = scanner.nextInt();
            }while (no <= 0);

            do {
                System.out.print("어떤 진수로 변환할까요? (2~36): ");
                cd = scanner.nextInt();
            }while(cd < 2 || cd > 36);

            dno = cardConv(no, cd, cno);

            System.out.print(cd + "진수로는 ");
            for(int i = 0; i <= dno ; i++){
                System.out.print(cno[i]);
            }
            System.out.println("입니다.");

            System.out.print("한 번 더 할까요? (1.예/0.아니요): ");
            retry = scanner.nextInt();
        }while(retry == 1);


    }

    private static int cardConv(int no, int cd, char[] cno) {
        int dno = 0;

        do{
            int remain = no%cd;
            if(0<= remain&&  remain <= 9){
                cno[dno++] = (char)(remain + '0');
            }
            else{
                cno[dno++] = (char) (alphaPos + remain - numberAmount);
            }
            no /= cd;
        }while (no != 0);
        reverseSort(cno, dno);

        return dno;
    }

    // 역순으로 정렬
    private static void reverseSort(char[] cno, int dno) {
        int start = 0;
        int end = dno-1;
        do{
            char tmp = cno[start];
            cno[start] = cno[end];
            cno[end] = tmp;
            start++;
            end--;
        }while(start < end);
    }

    private static void clear(char[] cno, int dno){
        for(int i = 0; i < dno; i++){
            cno[i] = '\u0000'; // null로 초기화
        }
    }
}

 

Q7 오른쪽처럼 기수 변환 과정을 자세히 나타내는 프로그램을 작성하세요.

import java.util.Scanner;

public class Chap_q7_cardConv_print {

    private final static int alphaPos = 65; // 알파벳 'A'가 시작하는 ASCII 코드 위치
    private final static int numberAmount = 10; // 숫자 갯수

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int dno = 0; // 변환 후 자릿 수
        int no = 0; // 변환하는 정수
        int cd = 0; // 기수
        int retry = 0; // 다시 한번?
        char[] cno = new char[32]; // 변환 후 각 자리의 숫자를 넣어두는 문자의 배열
        System.out.println("10진수를 기수 변환합니다.");

        do{
            clear(cno, dno);
            do{
                System.out.print("변환하는 음이 아닌 정수: ");
                no = scanner.nextInt();
            }while (no <= 0);

            do {
                System.out.print("어떤 진수로 변환할까요? (2~36): ");
                cd = scanner.nextInt();
            }while(cd < 2 || cd > 36);

            dno = cardConv(no, cd, cno);

            System.out.print(cd + "진수로는 ");
            for(int i = 0; i <= dno ; i++){
                System.out.print(cno[i]);
            }
            System.out.println("입니다.");

            System.out.print("한 번 더 할까요? (1.예/0.아니요): ");
            retry = scanner.nextInt();
        }while(retry == 1);


    }

    private static int cardConv(int no, int cd, char[] cno) {
        int dno = 0;

        do{
            int remain = no%cd;
            no /= cd;
            if(no!=0) System.out.printf("%d|", cd);
            if(0<= remain&&  remain <= 9){
                cno[dno++] = (char)(remain + '0');
            }
            else{
                cno[dno++] = (char) (alphaPos + remain - numberAmount);
            }
            System.out.printf("\t%2d  ㆍㆍㆍ %d\n", no, remain);
            if(no!=0) System.out.println(" +--------------");
        }while (no != 0);
        reverseSort(cno, dno);

        return dno;
    }

    // 역순으로 정렬
    private static void reverseSort(char[] cno, int dno) {
        int start = 0;
        int end = dno-1;
        do{
            char tmp = cno[start];
            cno[start] = cno[end];
            cno[end] = tmp;
            start++;
            end--;
        }while(start < end);
    }

    private static void clear(char[] cno, int dno){
        for(int i = 0; i < dno; i++){
            cno[i] = '\u0000'; // null로 초기화
        }
    }
}