중복체크및 제거(String, HashMap, HashSet, Stream)

devdo·2022년 3월 30일
0

코딩테스트

목록 보기
13/13
post-thumbnail

문자 중복 체크와 중복 제거방식을 정리해보았습니다.


1. 중복체크 : String, Map

  • String
/**
 * 문자 중복 체크 -> 중복되면 "D" 아니면 "U"
 */

    public String solution(String str) {

        String answer = "D";
        String tmp = "";

        for (char c : str.toCharArray()) {
            // 포함되지 않는다면
            if (!tmp.contains(String.valueOf(c))) {
                tmp += String.valueOf(c);       // 이것까지 반드시 붙여줘야 함!
                answer = "U";
            }
        }

        return answer;
    }
  • HashMap(순서보장x, 중복을 허용하여 카운트하기)

  • map의 getOrDefault() 사용

    public String solution(String str) {

        String answer = "D";

        Map<Character, Integer> map = new HashMap<>();

        for (char c : str.toCharArray()) {
            map.put(c, map.getOrDefault(c, 0) + 1); // 중복되면 +1, 중복된것이 없으면 0 -> +1 해서 1
            if (!(map.get(c) > 1)) {    // 중복되지 않는건 초기화
                map.put(c, map.get(x) - 1);
                answer = "U";
            }
        }
        return answer;
    }
        String str = "hellooooo";

        // 중복 단어 찾기
        Map<Character, Integer> map = new HashMap<>();

        for (char x : str.toCharArray()) {
            map.put(x, map.getOrDefault(x, 0) + 1);
        }

        int maxCount = 0;
        char maxChar = '?';

        // 가장 많이 중복된 단어 찾기
        for (Map.Entry<Character, Integer> entry : map.entrySet()) {
            if (entry.getValue() > maxCount) {
                maxChar = entry.getKey();
                maxCount = entry.getValue();
            }
        }

        System.out.println("maxChar = " + maxChar);
  • map의 putIfAbsent() 이용
        Map<Character, Integer> map1 = new HashMap<>();
        for (Character c : str.toCharArray()) {
            map1.putIfAbsent(c, 0);
            map1.put(c, map1.get(c) + 1);
        }

        map1.forEach((key, value) -> System.out.println(key + " : " + value));
  • LinkedHashMap(순서보장o: 입력된 순으로) => 봉통 key 값 보장
    // 단순 단어 중복 문자 카운트 값 저장
    String str = "java";

    Map<String, Integer> map = new LinkedHashMap<>();	// vs TreeMap => 오름차순 정렬해주는 map

    for (String s : str.split("")) {
        Integer count = map.get(s);
        if (count == null) {
            map.put(s, 1);
        } else {
            map.put(s, count + 1);
        }
    }

    for (String key : map.keySet()) {
        System.out.println(key + ": "+ map.get(key));
    }
//        j: 1
//        a: 2
//        v: 1    

2. 중복제거 : Set, Stream(distinct)

  • HashSet(중복x, 순서 보장x)
	// 1. 중복 제거 (Set 이용)
	String[] report = {"muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"};
        
    HashSet<String> reportSet = new HashSet<>();
    for (String rep : report) {
         reportSet.add(rep);
    }
    // Set -> iterator 반복 출력
    Iterator<String> iterator = reportSet.iterator();
    while (iterator.hasNext()) {
        String data = iterator.next();
        System.out.println("data: "+data);
    }
  • LinkedHashSet(순서보장 O : 입력된 순서대로)

  • TreeSet(순서보장 O : 정렬(오름차순)이되는 Set)

	// 1. 중복 제거 (Set 이용)
	String[] report = {"muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"};
        
    HashSet<String> reportSet = new TreeSet<>();
    for (String rep : report) {
         reportSet.add(rep);
    }
    // Set -> iterator 반복 출력
    Iterator<String> iterator = reportSet.iterator();
    while (iterator.hasNext()) {
        String data = iterator.next();
        System.out.println("data: "+data);
    }
  • Stream distinct()
List<String> li = new ArrayList(
        Arrays.asList("A", "B", "B", "C", "D", "D")
);

List<String> distinctLi = li.stream()
                            .distinct()		// 중복제거
                            .sorted()       // 정렬(오름차순)
                            .collect(Collectors.toList());  // 다시 List 반환할려면 꼭 해줘야!

// for (String distinctElement : distinctLi) {
//  li.remove(distinctElement);				// 찾아서 제거하기
// }

System.out.println(li);

/** 실행결과
[B, D]
**/
profile
배운 것을 기록합니다.

0개의 댓글