문자열을 입력 받아 중복되는 문자를 제거 후 출력한느 문제다. 중복이란 단어를 보자마자 set을 사용하여 문제를 풀었는데. set 뿐 아니라 문자열을 직접 탐색하여 문자를 풀이하는 방법도 알아보자
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이기 때문에 문자열에 추가할 필요가 없어진다.
위 방법만 이해한다면 크게 어려운 코드가 아니다.
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