본문 바로가기
algorithm/Programmers

[Java] 중복된 문자 제거

by 이쟝 2023. 1. 27.

문제 설명

문자열 my_string이 매개변수로 주어집니다. my_string에서 중복된 문자를 제거하고 하나의 문자만 남긴 문자열을 return하도록 solution 함수를 완성해주세요.


제한사항
  • 1 ≤ my_string ≤ 110
  • my_string은 대문자, 소문자, 공백으로 구성되어 있습니다.
  • 대문자와 소문자를 구분합니다.
  • 공백(" ")도 하나의 문자로 구분합니다.
  • 중복된 문자 중 가장 앞에 있는 문자를 남깁니다.

입출력 예my_stringresult
"people" "peol"
"We are the world" "We arthwold"

입출력 예 설명

입출력 예 #1

  • "people"에서 중복된 문자 "p"와 "e"을 제거한 "peol"을 return합니다.

입출력 예 #2

  • "We are the world"에서 중복된 문자 "e", " ", "r" 들을 제거한 "We arthwold"을 return합니다.

1. 내가 푼 문제(LinkedHashSet과 StringBuilder 사용)

  • 다른 게 생각이 안나서 LinkedHashSet으로 풀었다.. 그래도 시간은 빠른데.. LinkedHashSet을 쓰지 않고도 푼 방법이 많다.. 생각보다 더..!
import java.util.LinkedHashSet;
import java.util.Iterator;

class Solution {
    public String solution(String my_string) {
        StringBuilder sb = new StringBuilder();
        LinkedHashSet<Character> set = new LinkedHashSet<>();

        for(char ch: my_string.toCharArray()) {
            set.add(ch);
        }
        
        //Iterator 생성 방법 (*한번 생성 후 재사용 할경우 재생성 필수)
		Iterator<Character> iter = set.iterator();
		while(iter.hasNext()) {
			sb.append(iter.next());
		}
        
        return sb.toString();
    }
}

 2. indexOf

  • 다른 분은 StringBuilder 없이 풀어서 오래걸렸는데 StringBuilder하니까 확실히 속도가 빠르다...!
  • indexOf로 하면 이미 있는 문자를 구분가능..!
class Solution {
    public String solution(String my_string) {
        StringBuilder sb = new StringBuilder();

        for(int i=0; i<my_string.length(); i++){
            if(i==my_string.indexOf(my_string.charAt(i)))
                sb.append(my_string.charAt(i));
        }

        return sb.toString();
    }
}

3. replaceAll과 subString 활용

  • 일단 먼저 StringBuilder에 저장한뒤에 그 문자를 my_string에서 해당하는 문자를 자르기 하는 식으로..!
class Solution {
    public String solution(String my_string) {
        StringBuilder sb = new StringBuilder();

        while(my_string.length() > 0) {
            sb.append(my_string.charAt(0));
            my_string = my_string.replaceAll(my_string.substring(0, 1), "");
        }

        return sb.toString();
    }
}

- replaceAll을 활용해서 풀고 싶었는데 막상 떠오르지 않았다...! subString이랑 같이 사용한 거 보고.. 아ㅏ.. 했다..

- 저번에 Set을 써봤던 경험으로 Set을 쓰긴 했는데 테스트 풀때는 나쁘지 않은 것 같은데 실제로 개발 할 때 쓸까..? 궁금하다.