코딩테스트/문제풀이 팁
int형 2차원 배열 복합정렬조건
asdft
2024. 3. 16. 19:56
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;
}
}