기록

프로그래머스_Java_테이블 해시 함수 본문

코딩테스트/Java

프로그래머스_Java_테이블 해시 함수

youngyin 2023. 10. 11. 10:00

문제

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

풀이

Comparator

Comparator는 Java에서 객체들을 비교하고 정렬하는 데 사용되는 인터페이스입니다. 이 인터페이스는 다음과 같이 선언되어 있습니다:

interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
}

Comparator는 주로 정렬된 컬렉션(예: 배열, 리스트)에서 요소들을 비교하고 정렬하는 데 사용됩니다. compare 메서드를 구현하여 두 객체를 비교하고 그 결과에 따라 정렬 순서를 결정할 수 있습니다.

  1. compare 메서드: compare 메서드는 두 개의 객체를 비교합니다. 이 메서드는 다음 규칙을 따릅니다.
    • o1o2보다 작으면 음수를 반환합니다.
    • o1o2와 같으면 0을 반환합니다.
    • o1o2보다 크면 양수를 반환합니다.
      예를 들어, 숫자를 비교하는 Comparator를 작성할 때, compare 메서드는 두 숫자의 차이를 반환할 수 있습니다.
  2. 정렬 방향 설정: Comparator를 사용하여 오름차순 또는 내림차순으로 정렬할 수 있습니다. 정렬 방향은 compare 메서드에서 결정됩니다. 오름차순으로 정렬하려면 o1o2보다 작을 때 음수를 반환하고, 내림차순으로 정렬하려면 큰 값을 반환하면 됩니다.
  3. 객체 비교 기준 제공: 객체의 특정 필드를 기준으로 정렬하거나 복잡한 비교 기준을 제공할 수 있습니다. 이것은 사용자 정의 객체의 정렬을 지원하는 데 유용합니다.
  4. Collections.sort 및 Arrays.sort와 함께 사용: ComparatorCollections.sortArrays.sort와 함께 사용하여 컬렉션을 정렬할 때 필요한 비교 기준을 제공합니다.
  5. 람다 표현식으로 구현: Java 8 이상에서는 람다 표현식을 사용하여 간단한 Comparator를 구현할 수 있습니다.

stream

Java의 스트림(Stream)은 데이터를 처리하는 데 유용한 개념입니다. 스트림은 데이터의 시퀀스를 나타내며, 데이터를 필터링, 변환, 그룹화 및 집계하는 연산을 지원합니다. Java 8부터 소개되었으며, 함수형 프로그래밍 스타일을 지원하여 코드를 간결하게 작성하고 병렬 처리를 쉽게 구현할 수 있게 해줍니다. 주요 스트림 연산에는 다음과 같은 것들이 있습니다:

  • filter(Predicate<T> predicate): 조건에 맞는 요소를 필터링합니다.
  • map(Function<T, R> mapper): 요소를 다른 형태로 변환합니다.
  • sorted(): 요소를 정렬합니다.
  • distinct(): 중복 요소를 제거합니다.
  • forEach(Consumer<T> action): 각 요소에 대한 작업을 수행합니다.
  • reduce(BinaryOperator<T> accumulator): 요소를 축소(집계)합니다.
  • collect(Collector<T, A, R> collector): 요소를 수집하여 결과를 생성합니다.

코드

import java.util.*;

class Solution {
    public int solution(int[][] data, int col, int row_begin, int row_end) {
        Arrays.sort(data, 
                    Comparator
                    .comparingInt((int[] a) -> a[col - 1])
                    .thenComparingInt((int[] a) -> -a[0])
                   );

        int answer = 0;
        for (int i=row_begin;i<=row_end;i++){
            int row_index = i;
            answer ^= Arrays.stream(data[row_index-1])
                .map(it -> it%row_index)
                .reduce(0, (a, b) -> a+b);
        }

        return answer;
    }
}

마무리하면서

프로젝트에서 자바를 자주 사용하다 보니, 자바로 코딩 테스트 문제를 푸는게 필요하다고 생각했다. 기존에는 파이썬으로 코딩 테스트 문제를 풀었었는데, 자바로 같은 문제를 다시 풀려고 하다보니까 어떻게 구현해야 할지 2배 이상 고민하게 되더라.

'코딩테스트 > Java' 카테고리의 다른 글

프로그래머스_Java_시소짝꿍  (0) 2023.10.18
프로그래머스_java_숫자 카드 나누기  (0) 2023.10.07
백준_9663_N-Queen  (0) 2020.09.01
백준_18119_단어 암기  (0) 2020.09.01
Comments