Greedy 알고리즘 #2

ims·2020년 10월 17일
0

알고리즘

목록 보기
10/23

Sorting

Java에서는 Arrays.sort() 함수를 이용해서 array를 정렬할 수 있다.

public class ArrayTest {
    public static void main(String args[]){
        Integer[] arrayTest = {2,3,2,4,56,7,43,21};

        Arrays.sort(arrayTest, Collections.reverseOrder());

        for(int i : arrayTest){
            System.out.print(i + " ");
        }
    }
}

DESC 정렬을 하고 싶으면 인자에 Collections.reverseOrder()를 같이 넘겨준다. Arrays의 parameter는 Generic type이므로 int가 아니라 Integer로 선언을 해주어야 한다.

행렬

행 -> 가로 : 세로의 길이 : 행의 길이
열 -> 세로 : 가로의 길이 : 열의 길이

2차원 배열 정렬

참조 블로그

https://moon1226.tistory.com/31

Arrays.sort()의 두번째 parameter는 Comparator를 사용한다.

고로 Comparator를 손보면 된다.

public class SortTest {
    public static void main(String args[]) {
        int data[][] = {{4,3},{4,1},{1,2}};

        Arrays.sort(data, Comparator.comparingInt(num->num[0]));

        for(int i[] : data){
            for(int j : i){
                System.out.print(j + " ");
            }
            System.out.println("");
        }
    }
}

Comparator.comparingInt(num->num[0]) = 배열의 0번째 요소 기준으로 2차원 배열을 정렬, 1이면 첫번째 요소를 기준으로 정렬

기출문제 #2

2차원 배열이 주어진다. 2차원 배열의 행에서 가장 작은 수들 중에 가장 큰 수를 출력하는 문제

Idea

2차원 배열이 주어진다. 라는 생각에 2차원 배열을 선언하고 각 행을 정렬해서 최소값을 추출하려고 했다. 그렇게 해도 되나 복잡해진다. 해설에 더 간단한 방법이 있었다.

해설

public class GreedyCardGameOfNumberPage96 {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);

        // N, M을 공백을 기준으로 구분하여 입력 받기
        int n = sc.nextInt();
        int m = sc.nextInt();
        int result = 0;

        // 한 줄씩 입력 받아 확인하기
        for (int i = 0; i < n; i++) {
            // 현재 줄에서 '가장 작은 수' 찾기
            int min_value = 10001;
            for (int j = 0; j < m; j++) {
                int x = sc.nextInt();
                min_value = Math.min(min_value, x);
            }
            // '가장 작은 수'들 중에서 가장 큰 수 찾기
            result = Math.max(result, min_value);
        }

        System.out.println(result); // 최종 답안 출력
    }
}

최소값만 찾으면 되므로, 2차원 배열을 굳이 선언하지 않아도 입력 단계에서 찾아도 된다. Math 함수를 이용해서 최소값을 찾는다.

기출문제 #3

number와 k를 입력받는데, 두가지 선택을 할 수 있다. number가 k로 나누어 떨어질경우 k로 계속 나누고, 아닐 경우 1을 빼준다. 1이 될때까지 시행한 횟수?

public class GreedyUntilOnePage99 {
    public static void main(String args[]) {

        int number=17;
        int count=0;
        int K=4;

        while(number !=1){
            if(number%K==0){
                number /= K;
            }else{
                number -= 1;
            }
            count++;
        }
        System.out.println(count);
    }
}

나누어 떨어지는 것을 어떻게 하지? 라고 생각했는데 % 연산자가 있었다. while loop에서 살짝 헷갈렸었고, if{count++} else{ count ++} 로 했었는데 sonarLint 에서 겹치는 것 ( count )를 밖으로 빼는 것을 추천을 했다.

profile
티스토리로 이사했습니다! https://imsfromseoul.tistory.com/ + https://camel-man-ims.tistory.com/

0개의 댓글