[ 중복문자제거 ]

2024. 11. 13. 19:53카테고리 없음

public class Main {
    public void solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();
        //charAt()활용
        String answer ="";
        for(int i=0; i<input.length();i++){
            if(input.indexOf(input.charAt(i))==i) answer += input.charAt(i);
        }
        System.out.println(answer);
    }

    public static void main(String[] args) throws Exception{
        new Main().solution();
    }
}

 

.indexOf() 메서드 활용

=> 해당 문자가 가장 처음 발견되는 인덱스를 반환하는 메서드

 

 


+) HashSet 사용

  • 문자열의 길이가 길어질수록 시간 복잡도가 크게 증가하며, 중복된 문자가 많을 경우에는 중복 체크로 인해 불필요한 반복이 발생하게 된다. => 중복을 허용하지 않는 HashSet 사용하여 효과적으로 제거 가능

 

Set이란?

-> Set 인터페이스 구현 클래스에서는 객체를 중복해서 저장할 수 없으며, 하나의 null 값만 저장할 수 있다

또한 중복을 자동으로 제공해준다!

 

Set는 비선형구조이다!

Heap 영역에 존재하며, 비선형구조이기 때문에 순서의 개념과 인덱스가 존재하지 않는다!

-> 때문에 값을 추가/삭제 하는 경우, set 내부에 해당 값을 검색하여 해당 기능을 수행해야 한다

이로 인해 처리 속도가 List 구조에 비해 느리다는 단점이 있다

 

HashSet 이란?

-> Set 인터페이스에서 지원하는 구현 클래스이다 (Set의 성질 그대로 상속받음)

즉, 다음의 성질을 가진다

1. HashSet은 중복된 값을 허용하지 않는다

 

2. List 등과는 다르게 저장한 순서가 보장되지 않는다  (저장 순서를 유지하려면 LinkedHashSet 사용)

 

3. null을 값으로 허용한다

 

// 타입을 지정 가능
HashSet<String> animals1 = new HashSet<String>();

// 타입을 생략하여 사용 가능 -> 빈 HashSet생성 시 사용
HashSet<String> animals2 = new HashSet<>();  

// 초기 용량(Capacity) 설정
HashSet<String> animals3 = new HashSet<>(10); 

 // animal의 모든 값을 가진 HashSet 생성 
HashSet<String> animals4 = new HashSet<>(animals1);

//초기값 지정 가능
HashSet<String> animals5 = new HashSet<>(Arrays.asList("tiger", "lion", "fox"));

 

 

HashSet 요소에 add() 메소드를 호출하여 값을 추가 가능하다!

HashSet<String> animals = new HashSet<>()
	animals.add("tiger");
    animals.add("lion");
    animals.add("fox");

HashSet은 저장 순서가 보장되지 않기에 특정 위치에 값을 추가하거나 할 수 없다!!

 

입력되는 값이 HashSet내부에 존재하지 않으면, 값을 HashSet에 추가한 후 true 반환 / 내부에 존재한다면 false를 반환한다

 

size() 메소드를 사용하여 Hash의 크기를 구할 수 있다

HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3));

//set 크기 : 3
System.out.println(set.size());

 

remove(), clear() 메소드를 사용하여 Hash값을 제거할 수 있다

HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3));

//값1 제거
set.remove(2);

//모든 값을 제거

set.clear();

 

 

원하는 값에 대해 contains(value) 메소드를 통해 Hash 내부에 존재하는지 확인이 가능하다

HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3));

//set 내부에 값 1이 있다면 -> true/ 없다면 false 출력
System.out.println(set.contains(1));

 

 

 


HashSet 을 적용해서 바꾼 코드

public class Main {
    public void solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();

        StringBuilder sb = new StringBuilder();
        Set<Character> set = new HashSet<>();

        for (int i = 0; i < str.length(); i++) {

            char c = str.charAt(i);

            if (!set.contains(c)) {
                sb.append(c);
                set.add(c);
            }
        }
        System.out.println(sb);
    }

    public static void main(String[] args) throws Exception{
        new Main().solution();
    }
}