알고리즘 with 자바

6. 중복문자제거

yki1204 2021. 4. 15. 05:49

문제 설명

소문자로 된 한개의 문자열이 입력되면 중복된 문자를 제거하고 출력하는 프로그램을 작성하세요.

중복이 제거된 문자열의 각 문자는 원래 문자열의 순서를 유지합니다.

 

입력예시: ksekkset

출력예시: kset

문제 풀이

이상하게도 중복 제거라는 말이 나오면 Set이나 Map이 먼저 떠오른다.

지금 같은 경우는 Key에 대한 Value는 필요 없는 상황이니 먼저 Set으로 문제를 접근해 본다.

public String solution(String s) {
	
	Set<Character> set = new LinkedHashSet<>();
	
	for(char c : s.toCharArray()) {
		set.add(c);
	}
	
	Iterator<Character> iter = set.iterator();
	
	String result ="";
	while(iter.hasNext()) {
		result += iter.next();
	}
	
	return result;
}

중요한 포인트는 순서대로 출력해야 하니 일반 HashSet이 아닌 LinkedHashSet을 사용한 부분이다.

중복제거를 위해 add 후 다시 Iterrator로 출력하는 형태이다.

 

다만, 이렇게 하면 루프를 두번을 타게 되는데 이를 한번으로 줄일수 있는 방법이 있다.

 

indexOf()를 활용하는 방법으로 for문을 돌며 i번째의 문자의 indexOf() 결과가 i랑 같으면 첫번째로 확인되는 문자(중복이 되기 전)라는 점을 이용한 방법이다.

public String solution2(String s) {
	
	int i = 0;
	String result = "";
	
	for(char c : s.toCharArray()) {
		
		if(s.indexOf(c) == i) {
			result += c;
		}
		i++;
	}
	
	return result;
	
}