본문 바로가기
자바/자바 자료구조

자바 - LinkedHashSet으로 코테 푸는 법

by 신재은👩🏼‍💻 2024. 4. 28.

문제 2개만 더 풀면 끝이다, 힘내자!!!💖

 

LinkedHashSet은 HashSet의 순서 보장 기능을 확장한 Java 컬렉션입니다. LinkedHashSet은 요소가 추가된 순서를 유지하면서 HashSet의 모든 특성(빠른 접근 시간, 중복 허용 안 함 등)을 유지합니다. 이 특성 때문에 LinkedHashSet은 순서가 중요하거나 데이터 삽입 순서를 기록해야 할 때 유용하게 사용될 수 있습니다.

LinkedHashSet을 사용해야 하는 문제 유형

  1. 순서를 유지해야 하는 중복 제거: 입력 순서대로 요소를 저장하면서 중복을 허용하지 않아야 할 때.
  2. 순서가 중요한 데이터 집합 연산: 집합 연산을 수행하면서 요소의 입력 순서를 유지해야 하는 경우.
  3. 최근 사용 데이터 추적: 최근에 추가된 요소를 추적하면서 중복 입력을 허용하지 않아야 할 때 유용합니다.

가장 좋은 문제와 솔루션 예제

문제: 첫 번째 고유 문자 찾기

문제 설명: 주어진 문자열에서 처음으로 등장하는 고유 문자의 인덱스를 반환합니다. 모든 문자가 중복인 경우 -1을 반환합니다.

예시:

  • 입력: "loveleetcode"
  • 출력: 2 (첫 번째 고유 문자 'v'의 인덱스)

솔루션 코드

import java.util.LinkedHashSet;
import java.util.Set;

public class Solution {
    public int firstUniqChar(String s) {
        Set<Character> duplicates = new HashSet<>();
        LinkedHashSet<Character> order = new LinkedHashSet<>();

        for (char c : s.toCharArray()) {
            if (!duplicates.contains(c)) {
                if (order.contains(c)) {
                    order.remove(c);
                    duplicates.add(c);
                } else {
                    order.add(c);
                }
            }
        }

        if (!order.isEmpty()) {
            for (char c : order) {
                return s.indexOf(c); // 반환하자마자 종료, 가장 첫 번째 고유 문자의 인덱스
            }
        }
        return -1;
    }
}

코드 설명

  • duplicates HashSet은 중복 문자를 추적합니다.
  • order LinkedHashSet은 요소의 삽입 순서를 유지하며, 중복되지 않는 문자만을 유지합니다.
  • 문자열을 순회하면서 각 문자를 두 집합에 적절히 추가 또는 삭제합니다.
  • 순회가 끝난 후, order에 남아 있는 첫 번째 요소가 처음으로 등장하는 고유 문자입니다. 이 문자의 인덱스를 문자열에서 찾아 반환합니다.

LinkedHashSet을 사용하는 이 예제에서는 중복을 제거하면서도 요소의 추가 순서를 유지하는 것이 핵심입니다. 이를 통해 첫 번째 고유 문자를 효율적으로 찾을 수 있습니다. 이러한 접근 방식은 순서가 중요한 여러 다른 문제 유형에도 적용될 수 있습니다.