이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 (김태원)의 문제입니다.


문제 설명

 

코드

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

public class sec01_06 {

    public static String solution(String str){
        String result = "";
        for (int i = 0; i < str.length(); ++i) {
            if(str.indexOf(str.charAt(i)) == i) result += str.charAt(i);
        }
        return result;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println(solution(br.readLine()));
    }
}

또는

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

public class sec01_06 {
    public static String solution(String str) {
        StringBuilder sb = new StringBuilder();
        HashMap<Character, Boolean> map = new HashMap<>();
        for (char c : str.toCharArray()) {
            if (!map.containsKey(c)) {
                map.put(c, true);
                sb.append(c);
            }
        }
        return sb.toString();
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println(solution(br.readLine()));
    }
}

 

설명

첫 번째 코드 설명

  • indexOf() 메서드는 파라미터로 들어온 문자의 최초 등장 인덱스를 리턴함
  • charAt() 메서드는 파라미터로 들어온 정수에 해당하는 문자열의 인덱스값(문자)을 리턴
  • str.indexOf(str.charAt(i)) == i 조건문은 현재 문자가 문자열에서 처음 등장한 위치인지를 확인한다.
  • str.indexOf(str.charAt(i))는 현재 문자가 처음으로 등장하는 인덱스를 반환한다.
    이 인덱스가 현재 루프의 인덱스 i와 같으면, 해당 문자는 처음 등장한 것이므로 result에 추가한다.

 

두 번째 코드 설명

  • solution 메서드는 문자열 str을 입력받아 중복 문자가 제거된 문자열을 반환한다.
  • StringBuilder sb는 결과 문자열을 효율적으로 만들기 위해 사용된다.
  • HashMap<Character, Boolean> map은 각 문자가 이미 처리되었는지 여부를 추적하기 위해 사용된다.
  • for (char c : str.toCharArray()): 입력 문자열을 문자 배열로 변환하고, 각 문자를 순회한다.
  • if (!map.containsKey(c)): 현재 문자가 HashMap에 없는 경우, 즉 처음 등장하는 경우에만 HashMap에 추가하고 StringBuilder에 문자를 추가한다.
  • 최종적으로 StringBuilder에 누적된 문자열을 반환한다.