본문 바로가기
Dev/Algorithm

[프로그래머스] 데이터 분석

by VIPeveloper 2024. 5. 18.
반응형

문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

생각

  • 나는 클래스를 활용했다. compare 를 이용했고,, 장렬히전사했다.
  • sort 는 제대로 이해하고 쓴 것이 아니었다. 그냥 정렬이니까 쓴 것이지..
  • 오답 코드를 보며 반성하기 위해 기록을 남긴다.
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;

class Solution {
    public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) {
        int[][] answer = {};
        // 1. 순회를 하며 클래스 데이터값을 생성한다.
        ArrayList<Info> info = new ArrayList<>();
        for (int i = 0; i < data.length; i++) {
            Info hubo = new Info(data[i][0],data[i][1],data[i][2],data[i][3]);
            // 2. ext 에 따라서 val_ext 값보다 작은 값을 추출한다.
            if(ext.equals("num") && hubo.num < val_ext) info.add(hubo);
            else if(ext.equals("date") && hubo.date < val_ext) info.add(hubo);
            else if(ext.equals("remain") && hubo.remain < val_ext) info.add(hubo);
            else if(ext.equals("maxinum") && hubo.maximum < val_ext) info.add(hubo);
        }
        // 3. sort_by 로 정렬한다.
        Collections.sort(info, (o1, o2) -> {
            if(sort_by.equals("num")) return o1.num - o2.num;
            else if(sort_by.equals("date")) return o1.date - o2.date;
            else if(sort_by.equals("remain")) return o1.remain - o2.remain;
            else if(sort_by.equals("maxinum")) return o1.maximum-o2.maximum;
            return 0;
        });
        // 4. 답변형식대로 맞춘다.
        answer = new int[info.size()][4];
        for (int i = 0; i < answer.length; i++) {
            answer[i][0] = info.get(i).num;
            answer[i][1] = info.get(i).date;
            answer[i][2] = info.get(i).maximum;
            answer[i][3] = info.get(i).remain;
        }

        return answer;
    }
    public static class Info{
        int num;
        int date;
        int maximum;
        int remain;

        public Info(int i, int i1, int i2, int i3) {
            this.num = i;
            this.date = i1;
            this.maximum = i2;
            this.remain = i3;
        }
    }
}

코드

다른 사람 풀이

  • stream 을 이렇게 자유롭게 쓰는 것을 보며 진짜 물경력이 된 느낌이 들었다.
  • 해시와 스트림을 이용했다.
public class Main {

    public static void main(String[] args) {
        System.out.println(solution(new int[][]{{1, 20300104, 100, 80}
                , {2, 20300804, 847, 37}
                , {3, 20300401, 10, 8}}
                ,"date", 20300501, "remain"));
    }

    public static int[][] solution(int[][] data, String ext, int val_ext, String sort_by) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("code", 0);
        map.put("date", 1);
        map.put("maximum", 2);
        map.put("remain", 3);

        int [][] filtered_data = Arrays.stream(data)
                .filter(el -> el[map.get(ext)] < val_ext).toArray(int[][]::new);
        Arrays.sort(filtered_data, Comparator.comparingInt(el -> el[map.get(sort_by)]));

        return filtered_data;
    }
}
반응형