Java

Java) 메서드 활용 실습 : 다양한 문제 해결과 구현 방법

pogun 2025. 1. 1. 20:30

실습 총 8문제

1. 배열의 값에 *2배의 연산된 값이 산출되도록 메소드를 작성하시오.

public static void main(String[] args) {
    int num1[] = {1, 2, 3, 4, 5};
    getDouble(num1);
    System.out.println(Arrays.toString(num1));
}

static void getDouble(int num1[]){
    for(int i = 0; i < num1.length; i++){
        num1[i] = num1[i] * 2;
    }
}

: 배열은 참조형이라서 하나씩 순회하면서 바꿔야한다.

 

처리 과정 요약 : 

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

: 배열을 선언하고 초기화

 

2. getDouble(num1);

: 배열 num1의 참조값(주소)을 getDouble 메서드에 전달

 

3. static void getDouble(int num1[]) { ... }

: 전달받은 배열을 수정하여 각 요소의 값을 두 배로 만듬

 

4. System.out.println(Arrays.toString(num1));

: 수정된 배열을 출력

2. 변수를 선언하고 두 수를 나눗셈 연산으로 몫과 나머지를 구하는 메소드를 작성하시오.

public static void main(String[] args) {
    int num = 25;
    int num2 = 3;
    int tag[] = new int[1];

    int result = getResult(num, num2, tag);
    System.out.println("몫:" + result + " 나머지:" + tag[0]);
}

static int getResult(int num, int num2, int tag[]){
    int numberOt;

    numberOt = num / num2;
    tag[0] = num % num2;

    return numberOt;
}

: 여기서 보면 tag는 참조형이라 리턴값 없이도 배열 자체가 처리되어 main에 적용된다.

: 반면 num, num2는 기본형이라 연산값을 리턴해줘야 한다.

3. 두 점 (x, y)와 (x1, y1)간의 거리를 구한다.

public static void main(String[] args) {
    double d = getDistance(1, 1, 2, 1);
    System.out.println("두점의 거리는 " + d + "입니다");
}

static double getDistance(int x1, int y1,int x2, int y2){
    int y = (int)Math.pow(y2 - y1, 2);
    int x = (int)Math.pow(x2 - x1, 2);

    double distance = Math.sqrt(y + x);
    return distance;
}

두 점 간의 거리 구하는 공식 : 루트(y2-y1)^2 + (x2-x1)^2

루트 함수 : Math.sqrt

n승 구하는 함수 : Math.pow 

: 입력값이 (1, 1, 2, 1)이므로 함수에서도 파라미터 4개 선언

: Math.pow(y2 - y1, 2); 여기서 숫자 2는 2승을 의미한다.

 

**return값 뒤에 변수명은 가독성과 명확성을 높이기 위함**

**내부에서 처리한 값 어떤 것을 리턴시킬지 명확하게 하기 위함**

** return Math.sqrt(Math.pow(y2 - y1, 2) + Math.pow(x2 - x1, 2)); 이렇게 리턴해도 상관없긴함**

4. 대문자로 변경하는 함수를 작성하라.

public static void main(String[] args) {
    char ch[] = {'a', 'b', 'c'};
    UpperChar(ch);
    System.out.println(Arrays.toString(ch));
}

static void UpperChar(char c[]){
    for(int i = 0; i < c.length; i++) {

        if(c[i] >= 'a' && c[i] <= 'z') {
            c[i] = (char)(c[i] - 32);
        }
    }
}

: 아스키코드 활용한 문제

5. shuffle(섞는)메소드를 작성하시오.

public static void main(String[] args) {
    int original[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    System.out.println(Arrays.toString(original));
    // 이건 그냥 원본 숫자가 뭐였는지 보여주는 용도
    
    int result1[] = shuffle(original);
    System.out.println(Arrays.toString(result1));
    // 여기가 셔플된 숫자 확인
}

static int[] shuffle(int original[]){

    for(int i = 0; i < 10000; i++) {
        int x = (int)(Math.random() * 9);
        int y = (int)(Math.random() * 9);

        int temp = original[x];
        original[x] = original[y];
        original[y] = temp;
    }

    return original;
}

: 배열의 두 요소를 무작위로 선택하여 위치를 바꾸려면, 두 개의 서로 다른 인덱스(x, y)가 필요

: 배열 [1, 2, 3, 4, 5]에서 2번 인덱스(x = 2)와 4번 인덱스(y = 4)를 선택했다면, 값 3과 5를 교환

: 즉, swap이 필요하다.

: x에는 랜덤의 숫자 9개, y도 마찬가지

: swap에서 original에는 main에서 보내준 1 ~ 9까지 나열된 숫자가 있다.

: x랑 y는 1 ~ 9까지 섞인 배열이니까 swap에서 몇번째 자리 교환하면 original 배열이 점점 섞인다.

6. max(최대값)메소드를 작성하시오.

public static void main(String[] args) {
    int data[] = {3, 2, 9, 4, 7};
    System.out.println(Arrays.toString(data));
    System.out.println("최대값:"+ max(data));
}

static int max(int data[]){
    int max = data[0]; // 잴 처음 값이 기준. max = 0하면 - 값이 있을 시 망함.

    for(int i = 0; i < data.length; i++){
        if(data[i] > max){
            max = data[i];
        }
    }
    return max;
}

: static int[] max(int data[])

: static int max(int data[])

: 두개의 차이는 리턴되는 타입이 int[]랑 int 차이

: 즉, 배열 내에서 최대값을 찾아서 최대값만 리턴할 때 int

: 배열에서 최대값을 포힌한 새로운 배열을 리턴할 때 int[]

**중요하니 헷갈리지말고 기억하라**

7. 문자열에 숫자만 포함하고 있는지 문자가 포함되어 있는지 확인하는 isNumber메소드를 작성하시오.

방법 1.

public static void main(String[] args) {
    String str = "123";
    System.out.println(str+"는 숫자입니까? "+ isNumber(str));

    str = "1234o";
    System.out.println(str+"는 숫자입니까? "+ isNumber(str));

    str = "1a234";
    System.out.println(str+"는 숫자입니까? "+ isNumber(str));
}

static boolean isNumber(String str) {
    for(int i = 0; i < str.length(); i++){
        if(!Character.isDigit(str.charAt(i))){
            return false;
        }
    }
    return true;
}

charAt(i) : 문자열에서 i번째 인덱스에 있는 문자를 char 타입으로 반환

character.isDigit(char) : char 타입의 문자가 숫자인지 아닌지를 판단하는 메소드

: 숫자라면 true, 아닐 시 false 

: 즉 위 코드도 str에 있는 문자열을 하나씩 비교하면서 char 타입일 시 false 반환, int일 시 true 반환

 

방법 2.

public static void main(String[] args) {
    String str = "123";
    System.out.println(str+"는 숫자입니까? "+ isNumber(str));

    str = "1234o";
    System.out.println(str+"는 숫자입니까? "+ isNumber(str));

    str = "1a234";
    System.out.println(str+"는 숫자입니까? "+ isNumber(str));
}

static boolean isNumber(String str) {

    boolean b = true;

    for(int i = 0; i < str.length(); i++){
        char c = str.charAt(i);
        int asc = (int)c;
        if(asc < 48 || asc > 57){ // 아스키 코드에 의해서 숫자가 아님을 판단
            b = false;
            break;
        }
    }
    return b;
}

: 문자열을 하나씩 순회하면서 아스키코드로 변환

: 변환된 값으로 if조건문 걸어줌

: 아스키 코드를 보면 48 ~ 57까지가 숫자

: 그래서 48보다 작거나 57보다 크면 숫자가 아니기 때문에 false반환

8. 2차원 배열을 1차원 배열로 변환하는 함수를 작성하라.

방법 1.

public static void main(String[] args) {
    int arrayTwo[][] = {
            { 1, 2, 3, 4 },   // arrayTwo.length
            { 5, 6, 7, 8 },   // arrayTwo[n].length
            { 9, 10, 11, 12 }
    };

    int arrayOne[] = arrayTwoOfArrayOne( arrayTwo );
    System.out.println( Arrays.toString(arrayOne) );
}

static int[] arrayTwoOfArrayOne(int arrayTwo[][]){
    // 1차원 배열의 크기를 2차원 배열의 모든 요소의 수와 같아야 함으로
    int total = 0;

    // 2차원 배열의 모든 행의 길이를 합산하여 1차원 배열의 크기를 결정
    for(int i = 0; i < arrayTwo.length; i++){
        total += arrayTwo[i].length;
    }

    // 1차원 배열 생성
    int arrayOne[] = new int[total];

    int index = 0;
    for(int i = 0; i < arrayTwo.length; i++){
        for(int j = 0; j < arrayTwo[i].length; j++){
            arrayOne[index++] = arrayTwo[i][j];
        }
    }
    return arrayOne;
}

: arrayTwo.length는 행의 개수

: arrayTwo[i].length는 행의 길이

: 총 4 + 4 + 4 크기의 1차원 배열을 만든다.(total)

: 외부 반복문은 2차원 배열의 각 행을 순회한다.

: 내부 반목문은 해당 행의 각 요소를 순회한다.

: index++은 1차원 배열에서 요소를 채워넣을 위치를 나타낸다.

: 0번째부터 시작해서 지정된 크기까지 채워넣는다.

 

방법 2.

public static void main(String[] args) {
    int arrayTwo[][] = {
            { 1, 2, 3, 4 },   // arrayTwo.length
            { 5, 6, 7, 8 },   // arrayTwo[n].length
            { 9, 10, 11, 12 }
    };

    int arrayOne[] = arrayTwoOfArrayOne( arrayTwo );
    System.out.println( Arrays.toString(arrayOne) );
}

static int[] arrayTwoOfArrayOne(int arrayTwo[][]){
    int arrayOne[] = new int[arrayTwo.length * arrayTwo[0].length];

    int count = 0;
    for(int i = 0; i < arrayTwo.length; i++){
        for(int j = 0; j < arrayTwo[i].length; j++){
            arrayOne[count] = arrayTwo[i][j];
            count++;
        }
    }
    return arrayOne;
}

arrayTwo.length : 2차원 배열의 행(row)개수. 값은 : 3

arrayTwo[0].length : 첫 번째 행의 열(column)개수. 값은 : 4

: 그 밑에는 첫번째 방법 코드와 동일