알고리즘 문제/JAVA

[프로그래머스]250121:데이터분석(JAVA)

공백._. 2024. 4. 19. 14:27

https://school.programmers.co.kr/learn/courses/30/lessons/250121


  • 풀이과정[알고리즘]

2차원 배열로 코드, 날짜, 최대수, 남은수가 들어있는 데이터가 주어진다. ext의 값이 val_ext보다 작은 데이터를 추출하고, sort_by로 값을 정렬하는 문제. extList를 만들어서 data에 들어있는 순서대로 idx값을 전달해주는 역할을 하는 HashMap을 만들었다. 
1. 기준은 ext로 주어지기 때문에, extList에서 get으로 ext에 해당하는 인덱스를 가져오고,  for문으로 data를 돌리면서 해당 값을 추출하여 val_ext와 비교한다. 조건에 맞으면 lists에 추가.
2. Collections.sort Comparator를 사용해 람다식으로 식을 세웠는데 에러 발생. 찾아보니 람다 식 실행 시 외부 변수들에 대해서는 참조만 가능하고 값 변경은 불가능 하다고 한다. final or effectively final 변수만 가능하다고 한다(https://cobbybb.tistory.com/19 참조).  아무튼 그래서 idx값을 final Integer로 설정해주고, Integer.compare로 값을 비교하는 comparator를 작성하였다.

아이디어는 쉬웠는데 구현하는 부분이 생각보다 까다로웠던 문제.

import java.util.*;
public class P250121데이터분석_240419 {
    class Solution {
        public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) {
            int[][] answer = {};
            HashMap<String, Integer>extList=new HashMap();
            ArrayList<int[]>lists = new ArrayList();
            extList.put("code",0);
            extList.put("date",1);
            extList.put("maximum",2);
            extList.put("remain",3);
            //ext값이 val_ext보다 작은 데이터 추출
            for(int[]list:data){
                if(list[extList.get(ext)]<val_ext){
                    // System.out.println("===="+Arrays.toString(list));
                    lists.add(list);
                }
            }


            final Integer idx = extList.get(sort_by);
            // Collections.sort(lists,(a,b)->(a[idx].compareTo(b[idx])));
            Collections.sort(lists,(a,b)->Integer.compare(a[idx],b[idx]));
            answer = new int[lists.size()][4];
            int id=0;
            for(int[]li:lists){
                answer[id++]=li;
            }
            return answer;
        }
    }
}