본문 바로가기
알고리즘

[프로그래머스] 테이블 해시 함수 Java 풀이

by 내기록 2023. 7. 30.
반응형

목차 LIST

     

     

    최종 결과

    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            int[][] data = {{2,2,6}, {1,5,10}, {4,2,9}, {3,8,3}};
            int res = solution(data, 2, 2, 3);
            System.out.print(res);
        }
    
        public static int solution(int[][] data, int col, int row_begin, int row_end) {
    
            Arrays.sort(data, (o1, o2) ->{
                if(o1[col-1] == o2[col-1]) {
                    return Integer.compare(o2[0], o1[0]);
                }
                return Integer.compare(o1[col-1], o2[col-1]);
            });
    
            int result = 0;
    
            for(int i = row_begin - 1; i < row_end; i++) {
                int mod = 0;
                for(int d : data[i]) {
                    mod += d % (i+1);
                }
    
                result = result ^ mod;
            }
    
           return result;
        }
    }

    Integer.compare

    public static int compare(int x, int y)

    Parameter :

    x :
    the first int to compare
    y :
    the second int to compare
    Return :
    This method returns the value zero if (x==y),
    if (x < y) then it returns a value less than zero (음수, -1)
    and if (x > y) then it returns a value greater than zero. (양수, 1)
    return Integer.compare(o2[0], o1[0]);

    여기선 0번째 컬럼 값으로 "내림 차순"을 해야 하기 때문에 순서를 o2, o1 로 했다.

    Arrays.sort는 배열을 오름차순으로 정렬하는 역할을 가지기 때문에 값이 음수면 o1이 o2보다 앞에, 양수이면 o2가 o1보다 앞에 위치해야 함을 나타낸다. 따라서 양수값을 리턴하면 두 수를 swap한다.

     

    문제는 풀었지만 만족스럽지 않았던 코드

    먼저, 정렬을 위해 2중 포문을 사용하는게 마음에 안들었지만 떠오르는게 없어서 우선 사용했다.

    사실 이중포문으로 정렬해서 시간초과가 뜰 줄 알았다.

    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            int[][] data = {{2,2,6}, {1,5,10}, {4,2,9}, {3,8,3}};
            int res = solution(data, 2, 2, 3);
            System.out.print(res);
        }
    
        public static int solution(int[][] data, int col, int row_begin, int row_end) {
            col = col-1;
    
            for (int i = data.length-1; i > 0 ; i--) {
                for (int j = 0; j < i; j++) {
                    int first = data[j][col];
                    int second = data[j + 1][col];
    
                    if (first > second) {
                        swap(data, j);
                    } else if (first == second) {
                        first = data[j][0];
                        second = data[j + 1][0];
    
                        if (first < second) {
                            swap(data, j);
                        }
                    }
                }
            }
    
            int result = 0;
    
            for(int i = row_begin - 1; i < row_end; i++) {
                int mod = 0;
                for(int d : data[i]) {
                    mod += d % (i+1);
                }
    
                result = result ^ mod;
            }
    
           return result;
        }
    
        public static void swap(int[][] data, int j) {
            int[] tmp = data[j];
            data[j] = data[j + 1];
            data[j + 1] = tmp;
        }
    }

     

    회고

    배열 정렬에는 Arrays.sort를 사용하기

    처음부터 불필요한 코드랑 중복 없게 깔끔하게 짤 수 있게 생각하기

    반응형

    댓글