알고리즘 공부

99클럽 코테 스터디 6일차 TIL

HD9504 2024. 7. 28. 01:41

오늘의 학습 키워드

  • 해시테이블
  • 비트연산자

문제

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

문제 이해

  1. 입력받은 값의 col을 기준으로 오름차순 정렬을 한다.
  2. 겹칠 경우, 첫번째 컬럼의 값은 기본키이므로 기본키의 내림차순으로 정렬한다.
  3. 정렬된 데이터에서 S_i를 i 번째 행의 튜플에 대해 각 컬럼의 값을 i 로 나눈 나머지들의 합으로 정의합니다이부분이 처음에 이해가 잘안됐는데, 예시의 row start가 2, row end가 3으로 주어졌고,정렬된 3행이 1,5,10 이고 3행이므로 1510을 3으로 나눈 나머지의 값을 합을 구한다. 정렬된 2행이 2,2,6 이고 2행이므로 226을 2로 나눈 나머지의 값의 합을 구한다.
  4. 이렇게 구한 S_i를 누적하여 bitwise xor 해시값으로 반환한다.

나의 풀이

int answer = 0;

        int colIndex = col - 1;

        int[][] sorted = Arrays.stream(data).sorted(
                        (a, b) -> {
                            if(a[colIndex] == b[colIndex]) {
                                return b[0] - a[0]; //오름차순
                            } else {
                                return a[colIndex] - b[colIndex]; //내림차순
                            }
                        })
                .toArray(int[][]::new);

        for (int i = row_begin - 1; i <= row_end - 1; i++) {
            int cumSum = 0;
            for (int j = 0; j < sorted[i].length; j++) {
                System.out.println(sorted[i][j]);
                cumSum += sorted[i][j] % (i + 1);
            }
            answer ^= cumSum;
        }
        return answer;
  • 우선 입력 받은 행렬을 조건에 따라 정렬
  • 나머지의 누적합을 bitwise xor해서 반환한다.

오늘의 회고

  • 평소에 비트연산자를 업무에 사용할일이 없어서, bitwise xor 이라는 단어를 보고 찾아봐야했다.
  • 문제는 비교적 쉬운편이었다., 비트 연산에 대해서 다시 정리해보게 되어 좋았다.