본문 바로가기

Algorithm/Programmers

Level 1: PCCP 기출 문제 - 데이터 분석, Stream 필터와 정렬

문제 풀이: Stream 필터와 정렬

제공된 코드 data에서 ext 값이 val_ext보다 작은 데이터만 뽑은 후, sort_by에 해당하는 값을 기준으로 오름차순으로 정렬합니다.

class Solution {
    public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) {
        int[][] answer = {};
        return answer;
    }
}

단순히 Array의 Element를 필터하고 정렬하는 문제입니다. Stream을 사용하여 문제를 해결합니다.

import java.util.Arrays;

class Solution {
	public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) {
		return Arrays.stream(data).filter(e -> {
			int val = (0 == ext.compareTo("code")) ? e[0]
				: (0 == ext.compareTo("date")) ? e[1]
				: (0 == ext.compareTo("maximum")) ? e[2]
				: e[3];
			return val < val_ext;
		}).sorted((lp, rp) -> {
			// 오름차순으로 정렬
			return (0 == sort_by.compareTo("code")) ? (lp[0] < rp[0] ? -1 : 1)
				: (0 == sort_by.compareTo("date")) ? (lp[1] < rp[1] ? -1 : 1)
				: (0 == sort_by.compareTo("maximum")) ? (lp[2] < rp[2] ? -1 : 1)
				: (lp[3] < rp[3] ? -1 : 1);
		}).toArray(int[][]::new);
	}
}
코드 비고
Line 5:10 Arrays.stream(data).filter(e -> {}) int[][] 배열을 Stream 객체로 구성하고 Element를 필터합니다.
Line 11:16 sorted((lp, rp) -> {}) int[][] 배열을 Stream 객체로 구성하고 Element를 정렬합니다.
Line 17 toArray(int[][]::new) Stream객체를 다시 int[][] 배열로 캐스팅합니다.

문제 풀이: 인덱스를 매핑하여 코드 정리

기존의 문제 풀이에서 인덱스를 매핑하고 코드를 정리합니다.

필터와 정렬에서 필요한 인덱스는 code date maximum remain 문자열에 따라서 0 1 2 3으로 매핑됩니다.

이를 리스트로 구성하고 입력된 문자열 extsort_by로 접근하는 인덱스를 구합니다.

import java.util.*;

class Solution {
	public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) {
		List<String> map = Arrays.asList(new String[] { "code", "date", "maximum", "remain" });
		int ext_index = map.indexOf(ext);
		int sort_by_index = map.indexOf(sort_by);
		
		return Arrays.stream(data)
			     .filter(e -> e[ext_index] < val_ext)
			     .sorted((lp, rp) -> lp[sort_by_index] < rp[sort_by_index] ? -1 : 1)
			     .toArray(int[][]::new);
	}
}
코드 비고
Line 6:7 ext_index = map.indexOf(ext) 추출 또는 필터하는 데이터 이름과 데이터가 위치한 인덱스를 매핑하여 사용합니다.
sort_by_index = map.indexOf(sort_by)