package 섹션1_String;
import java.io.*;
public class 중복된_문자제거 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb= new StringBuilder();
boolean[] checkArr = new boolean[26];
String str= br.readLine();
char [] arr= str.toCharArray();
for(char c:arr){
if(!checkArr[c-'a']){ // 처음 나온 문자인 경우
checkArr[c-'a']=true;
sb.append(c);
}
}
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
}
- boolean 배열을 이용하여 가리키는 문자가 나온 문자인지 아닌지 확인
- 한번도 나오지 않은 문자인 경우, 배열에 방문 처리를 하고 정답에 문자 추가하기
✅ IndexOf 를 이용한 중복된 문자 찾기
for(int i=0;i<str.length();i++){
System.out.println(str.charAt(i)+" "+i+" "+ str.indexOf(str.charAt(i)));
}
ksekkset // 입력한 문자열
k 0 0
s 1 1
e 2 2
k 3 0
k 4 0
s 5 1
e 6 2
t 7 7
📍 두 값에 차이가 발생하는 이유
k 0 0
s 1 1
e 2 2
t 7 7
위의 네가지 경우를 보면 배열의 인덱스 값과 IndexOf의 리턴값이 동일하다.
k 3 0
k 4 0
s 5 1
e 6 2
하지만 위의 경우에는 두 개의 값이 다른데, 현재 배열의 위치에 있는 문자가 중복되어 존재하기 때문이다.
IndexOf는 동일한 문자값이 문자열 내에서 여러개 존재할 경우, 가장 앞에 있는 인덱스의 값을 리턴한다.
그래서 현재 가리키고 있는 문자가 앞에서 존재하고 있었기 때문에, 배열의 인덱스 보다 작은 값으로 IndexOf의 리턴값이 나오게 된 것이다.
IndexOf는 동일한 문자가 여러 개 존재할 경우, 가장 작은 값을 리턴하니까 문자가 중복된 문자가 존재하는 경우 indexOf의 값이 배열의 인덱스 보다는 큰 값을 가질 수 없다.
( 배열의 인덱스 값 ≥ IndexOf )
즉, 두 값이 일치하지 않는다는 것은 이전에 중복된 문자가 존재한다는 것이므로 두 값이 일치할때만 정답 문자열에 추가하자.
package 섹션1_String;
import java.io.*;
public class 중복된_문자제거 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb= new StringBuilder();
String str= br.readLine();
for(int i=0;i<str.length();i++){
if(str.indexOf(str.charAt(i))==i){
sb.append(str.charAt(i));
}
}
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
}
📌 중요한 코드
for(int i=0;i<str.length();i++){
if(str.indexOf(str.charAt(i))==i){
sb.append(str.charAt(i));
}
}
'알고리즘 > 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비' 카테고리의 다른 글
1-5 특정 문자 뒤집기 (0) | 2025.04.09 |
---|---|
1-3 문장 속 가장 긴 단어 (0) | 2025.04.08 |
1-2 대소문자 변환 (1) | 2025.04.07 |
1-1 문자 찾기 (0) | 2025.04.07 |