본문 바로가기

Java/Java 알고리즘 인프런

[Ch.01 - String] 06. 중복문자제거 (+ charAt, indexOf) #

728x90
반응형
6. 중복문자제거
 

설명

소문자로 된 한개의 문자열이 입력되면 중복된 문자를 제거하고 출력하는 프로그램을 작성하세요.

중복이 제거된 문자열의 각 문자는 원래 문자열의 순서를 유지합니다.

입력

첫 줄에 문자열이 입력됩니다. 문자열의 길이는 100을 넘지 않는다.

출력

첫 줄에 중복문자가 제거된 문자열을 출력합니다.

 

예시 입력

ksekkset

예시 출력

kset

 

1. StringBuilder 이용

2. 배열과 ArrayList 이용

3. Set 이용

4. Map 이용

 

1. StringBuilder 이용

import java.util.Scanner;

public class Main {
	public String solution(String str) {
		StringBuilder sb = new StringBuilder();
		String answer = "";

		int i = 0;
		char[] arr = new char[100];

		for (char x : str.toCharArray()) {
			String result = "";

			for (char y : arr) {
				if (y == x) {
					result = null;
					break;
				}
			}

			if (result != null) {
				sb.append(x);
				arr[i] = x;
				i++;
			}
		}

		return answer = sb.toString();
	}

	public static void main(String[] args) {
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String str = kb.next();
		System.out.println(T.solution(str));
	}

}

 

import java.util.Scanner;
  
public class Main {
  public String solution(String a){
    StringBuilder sb = new StringBuilder();
    int n=a.length();
    String answer="";
    
    for(int i=0;i<n;i++){
      char target=a.charAt(i);
      
      int index=a.indexOf(target);
      if(i==index){
        sb.append(target);
      }
     
    }
     answer=sb.toString();
      return answer;
  }
  public static void main(String[] args){
    Main T = new Main();
    Scanner kb=new Scanner(System.in);
    String a=kb.next();
    System.out.println(T.solution(a));
  }
}

 

char char=str.charAt(i)

-> 문자열의 위치를 문자로 지정

int i=char.indexOf(char)

-> 해당하는 문자의 위치를 양의 정수로 지정

-> indexOf는 가장 가까이의 해당하는 문자의 위치를 리턴

 

2. 배열과 ArrayList 이용

import java.util.*;
  
public class Main {
  public String solution(String str){
    ArrayList<Character> list = new ArrayList<>();
    char [] arr = str.toCharArray();
    String answer="";

	list.add(arr[0]);
    for(int i=0;i<str.length(); i++){
      for(int j=0;j<list.size(); j++){
        if(arr[i]==list.get(j))
          break;
        if(j==list.size()-1) list.add(arr[i]);
      }
    }
    for(char x : list) answer+=x;
    
    return answer;
  }
  public static void main(String[] args){
    Main T = new Main();
    Scanner kb=new Scanner(System.in);
    String str = kb.next();
    
    System.out.println(T.solution(str));
  }
}

첫번째는 넣고, 그 다음부터 확인 후 없으면 list의 마지막에서 넣는다.

 

3. Set 이용 -> 중복을 허용하지 않는 자료구조

import java.util.*;
  
public class Main {
  public static void main(String[] args){
    Scanner kb=new Scanner(System.in);
    String input=kb.next();
    char[] chars = input.toCharArray();
    Set<Character> set = new LinkedHashSet<>();
    
    for(char c:chars){
      set.add(c);
    }
    StringBuilder sb = new StringBuilder();
    for(char c:set){
      sb.append(c);
    }
    System.out.println(sb.toString());
  }
}

 

import java.util.*;
  
public class Main {
  public String solution(String str){
    char [] arr = str.toCharArray();
    Set<Character> set  = new LinkedHashSet<>();
    for(int i=0;i<str.length();i++){
      set.add(arr[i]);
    }
    String answer="";
    for(char x: set) answer+=x;
    return answer;
  }
  public static void main(String[] args){
    Main T = new Main();
    Scanner kb=new Scanner(System.in);
    String str = kb.next();
    
    System.out.println(T.solution(str));
  }
}

 

import java.util.Scanner;
import java.util.*;
public class Main {
  public static void main(String[] args){
    Scanner in=new Scanner(System.in);
    String input1 = in.nextLine();
    System.out.println(solution(input1));
  }
  static String solution(String s){
	String answer="";
    char[] arr = s.toCharArray();
    Set<Character> set = new LinkedHashSet<>();
    for(int i=0;i<arr.length;i++){
      set.add(arr[i]);
    }
    //String answer=

    for(char c : set)
      answer+=c;
    
    return answer;
  }
}

 

Queue<> queue = new LinkedList<>();

 

Set<> set = new LinkedHashSet<>();

-> 순서대로 넣는다.

Set<> set = new HashSet<>();

-> 순서없이 Value의 중복없이 넣는다.

 

Map <> map = new HashMap<>();

-> 순서없이 Value의 중복은 허용한다.

Map<> map = new LinkedHashMap<>();

-> 순서대로 Value의 중복은 허용해 넣는다.

 

Iterator<Integer> it = map.keySet().iterator();

while(it.hasNext())

{ int key = it.next(); 
System.out.println("key: " + key + ", value: " + map.get(key));
}
import java.util.*;
  
public class Main {
  public String solution(String str){
    Map<Character, Integer> map = new LinkedHashMap<>();
    char[] arr = str.toCharArray();
    for(int i=0;i<str.length();i++) map.put(arr[i], map.getOrDefault(arr[i], 0)+1);
    
    String answer="";
    Iterator<Character> it = map.keySet().iterator();
    while(it.hasNext()){
      Character key = it.next();
      answer+=key;
    }
    
    return answer;
  }
  public static void main(String[] args){
    Main T = new Main();
    Scanner kb=new Scanner(System.in);
    String str = kb.next();
    
    System.out.println(T.solution(str));
  }
}

 

 

 

 

 

4. Map 이용 -> LinkedHashMap은 들어온 순서를 기억하는 자료구조

 

(1) Map.Entry 이용

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
	public String solution(String str) {
		String answer = "";
		Map <Character, Integer> map = new LinkedHashMap<>();
		for(char x: str.toCharArray()) {
			map.put(x, map.getOrDefault(x, 0)+1);
		}
		for(Map.Entry<Character, Integer> entry: map.entrySet()) {
			char key = entry.getKey();
			answer+=key;
		}
		
		return answer;
	}

	public static void main(String[] args) {
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String str = kb.next();
		System.out.println(T.solution(str));
	}
}

 

2. Iterator 이용

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class Main {
	public String solution(String str) {
		String answer = "";
		Map <Character, Integer> map = new LinkedHashMap<>();
		for(char x: str.toCharArray()) {
			map.put(x, map.getOrDefault(x, 0)+1);
		}
		Set <Character> set= map.keySet();
        Iterator<Character> lt1 = set.iterator();
        while(lt1.hasNext()) {
            char key = ((char) lt1.next());
            answer+=key;
        }
		
		return answer;
	}

	public static void main(String[] args) {
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String str = kb.next();
		System.out.println(T.solution(str));
	}
}

+) 세련된 풀이

-> i번째의 문자에 해당하는 인덱스번호와 동일할 경우 (처음 등장하거나, 유일한 문자일 경우)

 해당하는 인덱스의 문자를 추가

 

import java.util.Scanner;

public class Main {
	public String solution(String str) {
		String answer = "";
		for (int i = 0; i < str.length(); i++) {
			if (str.indexOf(str.charAt(i)) == i)
				answer += str.charAt(i);

		}
		return answer;
	}

	public static void main(String[] args) {
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String str = kb.next();
		System.out.println(T.solution(str));
	}
}

import java.util.*;
  
public class Main {
  public static void main(String[] args){
    Scanner in=new Scanner(System.in);
    String str= in.next();
    Set<Character> set = new LinkedHashSet<>();
    String answer="";
    
    for(char c:str.toCharArray()) set.add(c);
    for(char c:set) answer+=c;
    
    System.out.println(answer);
  }
}
728x90
반응형