https://school.programmers.co.kr/learn/courses/30/lessons/147354
위 문제의 경우
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;
}
}
'코딩테스트 > 문제풀이 팁' 카테고리의 다른 글
[그리디] Kakao - 두 큐 합 같게 만들기 (0) | 2024.03.18 |
---|---|
[유클리드 호제법] 숫자 카드 나누기 (0) | 2024.03.17 |
[Kakao] 가장 많이 받은 선물 (0) | 2024.03.15 |
[Kakao] "년/월/일" 날짜 문제 "일"로 모두 환산하기 (0) | 2024.03.14 |
Stream, 되도록이면 사용하지 말자 (0) | 2024.02.26 |