일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 백준 2473번 세 용액 - java
- 백준 1647번 도시 분할 계획 - java
- 최소 힙 1927
- replace()
- Stack
- 백준 1806번 부분합 java
- 18111번 마인크래프트 - java 구현
- ac 5430번
- 백준 1043번 거짓말 - java 분리 집합
- toUpperCase
- HashMap
- Java
- 프로그래머스
- 백준 3190번
- HashSet
- 프로그래머스 java
- 프로그래머스 자바
- 백준 2467번 용액 자바 - 이분탐색
- 백준 1197번 최소 스패닝 트리 - java
- 백준 1541
- kotlin
- append
- StringBuilder
- 백준 14938번 서강그라운드
- 코틀린기초
- hash
- mysql hy000 에러
- dp
- StringTokenizer
- map
Archives
- Today
- Total
말하는 컴공감자의 텃밭
프로그래머스 테이블 해시 함수 <level2> - 자바(java) 2차원배열 정렬, XOR 연산 본문
728x90
문제 이해가 조금 걸렸다.
먼저 2차원 배열 data가 주어지고, col이 주어지는데. col번째 값으로 배열을 정렬해주고,
i번째 튜플에 대해 각 컬럼의 값을 i로 나눈 나머지의 합을 S_i에 넣어준다.
이후 begin과 end까지 모든 S_i를 누적해서 XOR값을 해시값으로 반환.
어려웠다. 처음보는 유형이기도 했고, col 기준으로 2차원 배열 정렬과 XOR도 어떻게 해야하지 싶었다.
먼저 정렬은 Comparator 인터페이스로 정렬기준을 추가해야한다.
그 중 람다식을 사용해서 간결하게 구현한 예시를 통해 예제를 작성해 보았다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | int[][] arr = new int[][]{{1,2},{2,3},{12,4},{5,30},{6,1}}; // 입력값 Arrays.sort(arr, (o1, o2) -> { return o1[0]-o2[0]; }); --> {1,2},{2,3},{5,30},{6,1},{12,4} // 첫번째 숫자로 정렬. 오름차순 Arrays.sort(arr, (o2, o1) -> { return o1[1]-o2[1]; }); --> {6,1},{1,2},{2,3},{12,4},{5,30} // 두번째 숫자로 정렬. 오름차순 ------------------------------------------------------------------ Arrays.sort(arr, (o1, o2) -> { return o2[0]-o1[0]; }); --> {12,4},{6,1},{5,30},{2,3},{1,2} // 첫번째 숫자로 정렬. 내림차순 Arrays.sort(arr, (o2, o1) -> { return o2[1]-o1[1]; }); --> {5,30},{12,4},{2,3},{1,2},{6,1} // 두번째 숫자로 정렬. 내림차순 | cs |
먼저 기본적인 틀을 보자. 이차원 배열중 첫번째를 비교하고 싶다면 배열의 첫번째 [0]로 비교한다. 두번째면 [1]이겠다.
오른차순을 원한다면 o1[0]-o2[0]; 내림차순을 원한다면 o2[0] - o1[0];으로 넣어주면 된다.
이후 XOR 계산은 2진수 비트로는 할 수 있으나 코드로는 처음접해서 찾아보니 ^ 기호를 사용하여 연산하더라.
꽤나 간단하게 코드를 완성시켰다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import java.util.*; class Solution { public int solution(int[][] data, int col, int row_begin, int row_end) { int answer = 0; Arrays.sort(data, (o1, o2) -> { // 2차원 배열 정렬. if (o1[col - 1] == o2[col - 1]) { // 만약 col번째가 같다면. return o2[0] - o1[0]; // 첫번째 칼럼 내림차순 정렬 } else { return o1[col - 1] - o2[col - 1]; // 같지 않다면 오름차순 정렬 } }); for (int i = row_begin - 1; i < row_end; i++) { // begin ~ end 반복문 int sum = 0; for (int column : data[i]) { // S_i 계산해서 sum에 넣기 sum += (column % (i + 1)); } answer ^= sum; // ^기호로 XOR 연산 } return answer; } } | cs |
참고: 2차원 배열 정렬 : https://ifuwanna.tistory.com/328
참고: 자바 XOR : https://codechacha.com/ko/java-xor/
728x90
'알고리즘 > Programmers - Java' 카테고리의 다른 글
프로그래머스 햄버거 만들기 <7점>- 자바(java) Stack (0) | 2023.06.23 |
---|---|
프로그래머스 안전지대 <2점> - 자바(java) (0) | 2023.06.18 |
프로그래머스 명예의전당 - 자바(java) 우선순위 큐 (0) | 2023.06.14 |
프로그래머스 체육복 - 자바(java) <8점> 1400점 달성 (0) | 2023.06.14 |
프로그래머스 덧칠하기 - 자바(java) Arrays.fill (0) | 2023.06.13 |
Comments