ezhoon

[인프런] 01-06 중복문자제거 본문

[Java] 인프런 문제풀이/Stirng(문자열)

[인프런] 01-06 중복문자제거

ezhoon 2022. 1. 17. 22:02

문제


  1. 한 개의 문자열 입력
  2. 중복된 문자 제거 후 출력
  3. 각 문자는 원래 문자열의 순서를 유지할 것

 

⚠️ 주의사항


  • 문자열의 순서를 유지해야 하므로 HashSet으로 정렬하기는 어려울 것 같으니 다른 방법을 찾아야 함

 

문제풀이


1. BufferedReader + StringBuilder + linkedHashSet + Iterator

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Java01_06 {

    public String solution(String str) {
        Set<String> linkedHashSet = new LinkedHashSet<String>();
        StringBuilder sb = new StringBuilder();

        for (char x : str.toCharArray()) {
            linkedHashSet.add(String.valueOf(x));
        }

        Iterator<String> linkedIter = linkedHashSet.iterator();

        while(linkedIter.hasNext()) {
            sb.append(linkedIter.next());
        }

        return sb.toString();
    }

    public static void main(String[] args) throws IOException {
        Java01_06 T = new Java01_06();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();

        System.out.println(T.solution(str));
    }
}

처음에 기본 HashSet으로 하다가 정렬이 제대로 되지가 않아서 찾아보다가 linkedHashSet으로 하는 방법이 있어서 사용해봤습니다.

하지만 위 코드는 너무 길고, 아직 제대로 알지도 못하는 Set 사용하는 것보다는 제가 익숙한 방법으로 풀어봤습니다.


 

2. BufferedReader + StringBuilder + charAt()

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Java01_06 {

    public String solution(String str) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            // System.out.println(str.charAt(i) + " " + i + " " + str.indexOf(str.charAt(i)));
            if (str.indexOf(str.charAt(i)) == i) sb.append(str.charAt(i));
        }
        return sb.toString();
    }

    public static void main(String[] args) throws IOException {
        Java01_06 T = new Java01_06();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String str = br.readLine();
        System.out.println(T.solution(str));
    }
}

주석 처리된 곳은 제가 풀면서 헷갈렸던걸 해결해 준 부분입니다.

주석 처리

결과 창에 보이듯이 두 번째 k부터는 i의 현재 위치 값이랑 indexOf의 i 현재 값이 다릅니다. 그 이유는 indexOf가 중복을 제거한 위치를 갖고 오기 때문입니다. 이런 것을 이용해서 if문에서 위치를 판단 한 뒤 같은 값들만 append 해줘서 출력했습니다.


결과 화면

 

Comments