문제 설명
제한사항
입출력 예
나의 풀이
굉장히 지저분한 내 코드,,, 다른 사람들 풀이 보고 눈물 한 방울 또르륵,,,
내가 접근했던 방식은
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]));
'++ > 자료구조&알고리즘' 카테고리의 다른 글
[Leetcode] 49. Group Anagrams (0) | 2024.01.03 |
---|---|
[Leetcode] 561. Array Partition (0) | 2023.12.19 |
[프로그래머스][Lv.0] 짝수의 합 - 120831 (0) | 2023.12.08 |
[프로그래머스][Lv.1] 숫자 문자열과 영단어 - 81301 (0) | 2023.12.08 |
[프로그래머스][Lv.1] 자연수 뒤집어 배열로 만들기 - 12932 (0) | 2023.11.23 |