1 분 소요

내 풀이 : Hashing 이용

주어진 문자열을 차례로 읽으며

처음 등장하는 문자는 Hash Table에 기록

=> 다음에 똑같은 문자가 등장했을 땐 포함 x

==> 중복을 허용하지 않는 HashSet 이용

package hashing ; 

import java.util.* ; 

class 중복된문자제거 {
    public String solution(String my_string) {
        String answer = "";
        HashSet<String> hashSet = new HashSet() ; 
        
        for(int i = 0  ; i < my_string.length() ; i++ ){
            String ch = ""+ my_string.charAt(i); 

            if(!hashSet.contains(ch)){
                hashSet.add(ch) ; 
                answer = answer + ch ; 
            }
        }
        return answer;
    }
}

개선 코드 1 : LinkdedHashSet
※ 위의 코드 개선 필요

이 코드에선 정답 문자열과 hash table을 따로 다루면서

정답 문자열에 포함하기 위해서 매번 해시테이블에서 검사하는 문자가 있는지 확인해야함

=> 중복값을 허용하지 않는 HashSet의 장점 전혀 활용 x

  • 순서 또한 유지되지 않으니 따로 문자열에 쌓아줘야함 (오히려 불편)

=> 중복값 검사는 난 전혀 신경쓰지 않고 값을 넣으면 알아서 걸러지는 기능 + 집어넣은 순서대로 유지되는 자료구조 필요

  • LinkdedHashSet : 입력 순서를 유지하면서 중복을 허용하지 않는 Set 구현체
import java.util.*;
class Solution {
    public String solution(String my_string) {
        String[] answer = my_string.split(""); // 문자 단위로 나눠서 
        Set<String> set = new LinkedHashSet<String>(Arrays.asList(answer));
        // LinkedHashSet(Collection)

        return String.join("", set); // join(구분자, Iterable elements) 
    }
}

개선 코드 2 : Stream
import java.util.* ; 
import java.util.stream.*; 
 
public class 중복된문자제거_Stream {
	public String solution(String my_string) {
        
		return my_string.chars() // String의 각 문자의 아스키 코드 값을 요소로 가지는 IntStream 반환 
				.mapToObj(Character::toString)
				/* Character 클래스의 toString으로 해당 아스키 코드 값들을 각각 문자열로 변환  
					=> 각 문자가 요소값인 String 스트림 생성 
					※ 바로 저 String을 Stream으로 변환하지 않은 이유 
						: 문자 단위로 분리되는게 아니라 저 String 자체가 하나의 요소값이 됨
						==> 문자단위로 먼저 잘라 그걸 요소값으로 갖는 스트림을 만들고  - chars() 
								그걸 각각 문자열로 변환해줘야함 
				*/
				.distinct()  // 중복된 문자 제거 
				.collect(Collectors.joining()) ; // 스트림의 요소들을 다 연결해 하나의 문자열 반환 
	}
}

댓글남기기