프로그래머스 (PCCE 기출) | 10번. 데이터 분석 - 구현 문풀 (Java)

728x90

⬛ 프로그래머스 (PCCE 기출) | 10번. 데이터 분석 - 구현 문풀 (Java)

문제 설명


💚문제 접근 방식

문제에서는 data[][] 2차원 배열로 들어오는 정보를 뽑아낼 ext 값을 기준으로 int val_ext 보다 작은 값만 추출한 뒤, 그들을 다시 sort_by 값을 기준으로 오름차순 정렬한 데이터를 2차원 배열 형태로 반환하라고 하고 있다.

  1. 우선 Data 클래스를 하나 선언했다. 이 안에서 내부적으로 2차원 배열과 동일한 셋을 가지되, sortby 값을 모두 갖게끔 만들어서 정렬 시 그 값을 기준으로 오름차순 정렬하도록 compareTo 메소드를 재정의 해뒀다.
  2. PriorityQueue 우선순위 큐에 Data 객체 값을 가질 건데, 어차피 이 자료구조에 담게 되면 자동정렬 될 거니까. ext값이 ext_Val 값보다 큰 값은 안담을 거라 continue 처리하고 그들을 제외한 값은 모두 담게 만들어서 자동 정렬 시켰다.
  3. 이후 answer 2차원 배열에다가 pQ에 있는 Data 객체를 하나씩 뽑아서 담고 최종적으로 리턴하면 정답 처리가 된다.

 

💚 제출 코드

import java.util.*;
class Data implements Comparable<Data>{
    int code;
    int date;
    int maximum;
    int remain;
    String target; //정렬 기준어 
    Data(int code, int date, int maximum, int remain, String target){
        this.code = code;
        this.date = date;
        this.maximum = maximum;
        this.remain = remain;
        this.target = target;
    }
    
    @Override
    public int compareTo(Data o){ // 각 비교 기준에 따라 정렬 
        if(this.target.equals("code")){
            return this.code - o.code;//오름차순 정렬 
        }
        if(this.target.equals("date")){
            return this.date - o.date;
        }
        if(this.target.equals("maximum")){
            return this.maximum - o.maximum;
        }
        if(this.target.equals("remain")){
            return this.remain - o.remain;//더 적게 남은 거 우선 정렬 
        }
        
        return this.code - o.code;
    }
}
class Solution {
    //솔루션 함수 
    public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) {

        PriorityQueue<Data> pQ = new PriorityQueue<>();
        
        //data에서 ext값이 val_ext 값보다 작은 데이터만 추출한 후 
        
        //[코드번호, 제조일, 최대수량, 현재수량] 순으로 들어옴 
        for(int[] x : data){
            //아래 기준에서 반대 되는 건 continue;
            if(ext.equals("date")){
                //제조일 기준일 때 더 크다면 넘김 
                if(val_ext <= x[1]) continue;
            }
            if(ext.equals("code")){
                if(val_ext <= x[0]) continue;
            }
            if(ext.equals("maximum")){
                if(val_ext <= x[2]) continue;
            }
            if(ext.equals("remain")){
                if(val_ext <= x[3]) continue;
            }
            //위에서 걸리지 않은 애들은 다담음 - 모두 ext 기준값보다 작은 애들만 남은 상황 
            pQ.offer(new Data(x[0], x[1], x[2], x[3], sort_by));
        }
    
        int len = pQ.size();
        
        int[][] answer = new int[len][4];
        
        for(int i=0; i<len; i++){
            Data cur = pQ.poll();
            answer[i][0] = cur.code;
            answer[i][1] = cur.date;
            answer[i][2] = cur.maximum;
            answer[i][3] = cur.remain;
        }
        
        
        
        return answer;
    }
}
728x90