관리 메뉴

The Nirsa Way

[프로그래머스 Lv1] PCCE 기출문제 10번 - 데이터분석 본문

코딩 테스트/프로그래머스

[프로그래머스 Lv1] PCCE 기출문제 10번 - 데이터분석

KoreaNirsa 2023. 12. 4. 23:22
반응형

 

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/250121

 

[프로그래머스 Lv1] PCCE 기출문제 10번 - 데이터분석

처음 시작 부분의 코드는 아래와 같이 시작합니다. 각각의 변수를 선언 및 초기화 후 ext의 문자열에 따라 dataNum을 할당, sort_by의 문자열에 따라 sortNum을 할당 합니다.

각각의 변수 활용은 아래와 같습니다.

  1. dataNum : 매개변수 ext 문자열에 따라 어떤 인덱스에 접근할지 정할 변수
  2. sortNum : 매개변수 sort_by 문자열에 따라 어떤 인덱스에 접근하여 정렬할지 정할 변수
  3. indexCount : 반환할 배열에 값을 할당할 때 인덱스로 활용할 변수
  4. count : 반환할 배열을 생성할 때 배열의 크기를 정할 변수
int dataNum = 0;
int sortNum = 0;
int indexCount = 0;
int count = 0;

if(ext.equals("code")) {
    dataNum = 0;
} else if(ext.equals("date")) {
    dataNum = 1;
} else if(ext.equals("maximum")) {
    dataNum = 2;
} else if(ext.equals("remain")) {
    dataNum = 3;
}

if(sort_by.equals("code")) {
    sortNum = 0;
} else if(sort_by.equals("date")) {
    sortNum = 1;
} else if(sort_by.equals("maximum")) {
    sortNum = 2;
} else if(sort_by.equals("remain")) {
    sortNum = 3;
}

 

final 변수의 경우 2차원 배열을 정렬할 때 람다식을 사용하게 되는데, 그때 사용하기 위한 변수입니다.

※ 람다식에서 사용하는 변수는 final 혹은 effectively final 이어야 합니다. 즉, 람다식에서 외부에 있는 지역변수를 참조할 때 해당 변수는 변하지 않는 값이어야 합니다.
※ effectively final : final이 붙어있지 않지만 초기화된 이후로 한번도 값이 변경되지 않은 변수

 

그 아래의 for문은 매개변수로 전달받은 data의 길이만큼 반복하고, 인덱스를 한바퀴 돌며 ext로 전달받은 키워드가 val_ext보다 작을 경우에만 count값을 증가시킵니다.

count를 모두 구했다면 반환할 배열을 선언 및 초기화하며 인덱스의 크기는 위에서 구한 유효한 개수인 count의 값, 그 다음에 들어갈 값은 문제에서 4개로 고정되어 있었습니다.

final int currentDataNum = dataNum;
final int currentSortNum = sortNum;

for(int i=0; i<data.length; i++) {
    if(data[i][currentDataNum] < val_ext) {
        count++;
    }
}

int[][] result = new int[count][4];

 

이제 다시 한번 data의 길이만큼 반복하고, 또 다시 ext로 전달받은 키워드가 val_ext보다 작은지 검증합니다. 이후에는 4번 반복하되, 조건이 일치하는 data[i][j] 배열의 값을 새로 생성해두었던 result[indexCount][j]로 할당합니다.

indexCount를 사용한 이유는 data 배열과 크기가 다르기 때문에 i번째 인덱스로 접근하게 되면 OutOfBounds가 발생합니다. 때문에 indexCount의 값인 0부터 시작하여 조건이 만족할때마다 1씩 증가시켜 result 배열의 크기만큼 값을 할당합니다.

이후에는 람다식을 활용하여 result 배열을 오름차순 정렬을 해주면 됩니다.

        for(int i=0; i<data.length; i++) {
        	if(data[i][currentDataNum] < val_ext) {
        		for(int j=0; j<4; j++) {
        			result[indexCount][j] = data[i][j];
        		}
        		indexCount++;
        	}
        } 
        
        Arrays.sort(result, (o1, o2) -> {
            return o1[currentSortNum] - o2[currentSortNum];
        });
        
        return result;
반응형