중복 문자 제거하기

최준호·2021년 8월 3일
0

알고리즘 강의

목록 보기
3/79

설명

문자열을 입력 받아 중복되는 문자를 제거 후 출력한느 문제다. 중복이란 단어를 보자마자 set을 사용하여 문제를 풀었는데. set 뿐 아니라 문자열을 직접 탐색하여 문자를 풀이하는 방법도 알아보자

코드

  1. 직접 탐색하여 중복 제거
public class RemoveDuplicateCharacter {
    //2. 문자열 체크를 통해 직접 확인하는 방법
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        String input = in.next();
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<input.length(); i++){
            char target = input.charAt(i);  //i 위치의 문자 확인
            int index = input.indexOf(target);  //target 문자의 문자열에서의 위치
            if(i==index){   //i와 index가 같다면 해당 문자는 문자열에서 처음 나온 문자, 그렇지 않다면 중복되는 문자
                sb.append(target);
            }
        }
        System.out.println(sb.toString());
    }
}

위 코드와 같이 charAt()을 통해 문자를 가져오고 indexOf()를 통해 해당 문자가 문자열에서 어느 위치에 가장 먼저 등장하는지를 확인한다.

예를 들어
aabbccdd를 입력 했을 경우

a 는 0
b 는 2
c 는 4
d 는 6
에서 가장 먼저 등장한다.

그럼 aa의 두번째 a의 경우 i는 1일때 검색되어 지지만 indexOf('a')로 검색되는 값은 0으로 나오게된다. 이 경우 두번째 a는 중복되는 a이기 때문에 문자열에 추가할 필요가 없어진다.

위 방법만 이해한다면 크게 어려운 코드가 아니다.

  1. set을 이용하여 중복 제거
public class RemoveDuplicateCharacter {
    //1. set을 활용한 방법
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        String input = in.next();
        char[] chars = input.toCharArray();
        Set<Character> set = new LinkedHashSet<>();
        for(char c : chars){
            set.add(c);
        }
        
        StringBuilder sb = new StringBuilder();
        for(char c : set){
            sb.append(c);
        }
        System.out.println(sb.toString());
    }
}

알고리즘 문제에서 중복을 제거하라 한다면 난 set이 가장 먼저 떠오른다. 중복을 없애기 가장 편하고 그냥 list에 담았다가 그대로 출력해주면 되기 때문이다. 하지만 set도 hashSet을 그대로 사용하냐 linkedHashSet을 사용하느냐 treeSet을 사용하느냐를 잘 선택해야하는데 Set에 대해서 좀 더 공부해서 사용하면 중복을 제거하는데 이만한 자료구조가 없다.

참고
hashSet = 순서 없이 리스트에 담는 방법
linkedHashSet = 넣는 순서대로 리스트에 담는 방법
treeSet = 넣는 값을 기준으로 오름차순으로 정렬하여 담는 방법

중복 제거는 역시 Set

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글