++/자료구조&알고리즘

[프로그래머스][PCCE 기출문제] 10번 / 데이터 분석 - 250121

writtenbyrla 2023. 12. 12. 10:45

문제 설명


 

제한사항


입출력 예

 

 


 

나의 풀이

굉장히 지저분한 내 코드,,, 다른 사람들 풀이 보고 눈물 한 방울 또르륵,,,

 

내가 접근했던 방식은

1. ext 키워드에 따라 answer 배열의 길이 선언을 위한 조건식(count를 변수로 둠)
2. 배열 선언 후, val_ext보다 작은 경우만 answer 배열에 복사(index가 다르기 때문에 answerIndex 변수 새로 지정)
3. 오름차순 정렬(Comparator 이용)

 

import java.util.Arrays;
import java.util.Comparator;

class Solution {
    public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) {
        int count = 0; // 배열 크기 지정을 위한 변수
        
        for(int i=0; i<data.length; i++){ // 조건에 맞게 배열 크기 구함
            if(ext.equals("code")&&(data[i][0]<val_ext)){
                count++;
            }else if(ext.equals("date")&&(data[i][1]<val_ext)){
                count++;
            }else if(ext.equals("maximum")&&(data[i][2]<val_ext)){
                count++;
            }else if(ext.equals("remain")&&(data[i][3]<val_ext)){
                count++;
            }
        }
        
        int[][] answer = new int[count][4]; // 배열 선언
        int answerIndex = 0; // 새로운 배열 인덱스를 위한 변수 선언
        
        for(int i=0; i<data.length; i++){ // 조건에 따라 배열 복사
                if(ext.equals("code")&&(data[i][0]<val_ext)){
                    answer[answerIndex++] = Arrays.copyOf(data[i], data[i].length);
                }else if(ext.equals("date")&&(data[i][1]<val_ext)){
                    answer[answerIndex++] = Arrays.copyOf(data[i], data[i].length);
                }else if(ext.equals("maximum")&&(data[i][2]<val_ext)){
                    answer[answerIndex++] = Arrays.copyOf(data[i], data[i].length);
                }else if(ext.equals("remain")&&(data[i][3]<val_ext)){
                    answer[answerIndex++] = Arrays.copyOf(data[i], data[i].length);
                }
        }
        
        if(sort_by.equals("code")){ // sort_by에 따라 오름차순 정렬
            Arrays.sort(answer, Comparator.comparingInt(row -> row[0]));      
        }else if(sort_by.equals("date")){
            Arrays.sort(answer, Comparator.comparingInt(row -> row[1]));
        }else if(sort_by.equals("maximum")){
            Arrays.sort(answer, Comparator.comparingInt(row -> row[2]));
        }else if(sort_by.equals("remain")){
            Arrays.sort(answer, Comparator.comparingInt(row -> row[3]));
        }
        
        return answer;
    }
}

 

보통 배열 정렬 시에는 Arrays.sort()를 이용하지만, 2차원 배열에서 조건이 필요할 경우 Comparator.comparing()을 이용할 수 있다.

람다 표현식 row -> row[3] 를 이용하여 조건을 주면 각 행의 3번째 인덱스를 기준으로 정렬하겠다는 의미임.

 

이렇게 할 경우 성능은  메모리: 83.4 MB, 시간: 2.35 ms인데, 다시 한번 짜봐야지

 

 


 

나의 풀이2

바뀐 포인트

1. ext 키워드를 미리 배열(arr)로 담고 해당 열 index를 변수에 담아 반환하여 조건문에서 간단하게 일치여부 확인
2. 조건에 해당하는 것만 list에 담아 배열로 옮김(배열 초기 선언시 크기에 대한 count 조건 따로 안걸어도 됨)

3. 정렬할 때 sort_by와 arr[index]를 확인하고 싶었으나 람다 표현식은 변수로 넣으면 안되는 것 같음... 이거는 또 알아보고 수정해야지
import java.util.*;

class Solution {
    public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) {
        
        // ext 키워드 배열로 담음
        String[] arr = {"code", "date", "maximum", "remain"};
                
        // ext 키워드 일치 여부 확인하여 index 반환
        int index = 0;
        for(int i=0; i<arr.length; i++){
            if(ext.equals(arr[i])){
                index = i ;
            }
        }
        
        // list에 조건에 해당하는것만 담은 후 배열로 변환
        List<int[]> list = new ArrayList<>();
        for(int i=0; i<data.length; i++){
            if(data[i][index]<val_ext){
                list.add(data[i]);
            }
        }    
            
        int[][] answer = new int[list.size()][4];
        for(int i=0; i<answer.length; i++){
            answer[i] = list.get(i);
        }

		// 오름차순 정렬
        if(sort_by.equals("code")){
            Arrays.sort(answer, Comparator.comparingInt(row -> row[0]));      
        }else if(sort_by.equals("date")){
            Arrays.sort(answer, Comparator.comparingInt(row -> row[1]));
        }else if(sort_by.equals("maximum")){
            Arrays.sort(answer, Comparator.comparingInt(row -> row[2]));
        }else if(sort_by.equals("remain")){
            Arrays.sort(answer, Comparator.comparingInt(row -> row[3]));
        }

        return answer;
    }
}

 

메모리: 75.4 MB, 시간: 2.31 ms

성능개선이 아주 조금 되었음...!

 

+++ 

정렬 방식 간단하게 바꾸고 싶어서 아래와 같이 해봤으나

메모리: 87.1 MB, 시간: 3.77 ms 오히려 성능 저하됨...

int sortIndex = Arrays.asList(arr).indexOf(sort_by);
Arrays.sort(answer, Comparator.comparingInt(row -> row[sortIndex]));