본문 바로가기
코딩테스트/문제풀이 팁

int형 2차원 배열 복합정렬조건

by asdft 2024. 3. 16.

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

 

프로그래머스

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

programmers.co.kr

 

위 문제의 경우

1. 조건에 맞게 2차원 배열 sorting

2. 해당 튜플의 모든 인자값을 mod로 계산해 누적합 구하고, 이들을 List 배열에 저장

3. List에 저장되어 있는 mod의 누적합 값들 XOR 연산 후 값 반환

 

세가지 순서로 진행했다.

 

여기서 주의해야 할 점은 

복합 정렬에 조건을 람다식으로 표현하는 것이다.

아래의 코드를 살펴보자

 

//튜플의 col 번째 컬럼값 기준으로 오름차순 정렬하되, 값이 동일하면 첫번째 컬럼값 기준으로 내림차순
        Arrays.sort(data, (a,b) -> {
            if(a[col-1] == b[col-1]){
                return b[0]-a[0];  // 내림차순
            }
            else{
                return a[col-1]-b[col-1];	//오름차순
            }
        });

 

1. 튜플의 col 번째 컬럼값 기준으로 오름차순 정렬

2. col번째 컬럼값이 동일할 경우, 첫번째 컬럼값 기준으로 내림차순 정렬

문제에서 확인할수 있듯이, 위 2가지의 조건에 따라 정렬 조건이 나뉘어진다.

 

그래서 if - else 구문을 통해 두 조건에 따라 각각 정렬조건을 다르게 해주었다.

람다식 표현의 경우 함수로 표현하기에 간단하므로 꼭 알아두자!!

 

아 그리고 XOR 연산 a ^ b 이므로 이것도 알아두자.

코드

import java.util.*;
class Solution {
    public int solution(int[][] data, int col, int row_begin, int row_end) {
        
       //튜플의 col 번째 컬럼값 기준으로 오름차순 정렬하되, 값이 동일하면 첫번째 컬럼값 기준으로 내림차순
        Arrays.sort(data, (a,b) -> {
            if(a[col-1] == b[col-1]){
                return b[0]-a[0];  // 내림차순
            }
            else{
                return a[col-1]-b[col-1];
            }
        });
        
        List<Integer> modResult = getModResult(data, row_begin, row_end);
        
        return getXor(modResult);
        
    }
    
    private static List<Integer> getModResult(int[][] data, int row_begin, int row_end){
        List<Integer> result = new ArrayList<>();
        
        for(int i=row_begin;i<=row_end;i++){    
            int sum = 0;
            for(int j=0;j<data[0].length;j++){
                sum += data[i-1][j] % i;        //row_begin은 ~번째 이므로 data의 인덱스로쓰려면 -1 해야함
            }
            result.add(sum);
        }
        return result;
    }
    
    private static int getXor(List<Integer> modResult){
        int hashValue = 0;
        
        for(int i=0;i<modResult.size();i++){
           hashValue ^= modResult.get(i);
        }
        return hashValue;   
    }
    
    
}