설명
소문자로 된 한개의 문자열이 입력되면 중복된 문자를 제거하고 출력하는 프로그램을 작성하세요.
중복이 제거된 문자열의 각 문자는 원래 문자열의 순서를 유지합니다.
입력
첫 줄에 문자열이 입력됩니다. 문자열의 길이는 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);
}
}
'Java > Java 알고리즘 인프런' 카테고리의 다른 글
[Ch.01 - String] 08. 유효한 팰린드롬 (+ replaceAll ) (0) | 2022.05.15 |
---|---|
[Ch.01 - String] 07. 회문 문자열 (+ str.equalsIgnoreCase(tmp)) (0) | 2022.05.15 |
[Ch.01 - String] 05. 특정 문자 뒤집기 (+ isAlphabetic) (0) | 2022.05.12 |
[Ch.01 - String] 04. 단어 뒤집기 # (+StringBuilder) (0) | 2022.05.12 |
[Ch.01 - String] 03. 문장 속 단어 # (+ split) (0) | 2022.05.12 |