중복된 문자 제거
중복된 문자 제거
초기 접근 및 로직 구상 방식
문자열에 중복을 제거하고 담는 것이니, set을 생각함. 이 문제에서는 출력값이 순서대로이니 입력값을 순서대로 받는 LinkedHashSet을 사용하기로 함.
시도
1차 제출
- 성공.
1차 제출 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.*;
class Solution {
public String solution(String my_string) {
Set<Character> set = new LinkedHashSet<>();
char[] c = my_string.toCharArray();
StringBuilder sb = new StringBuilder();
for(int i = 0; i < c.length; i++){
set.add(c[i]);
}
for(char i : set){
sb.append(i);
}
return sb.toString();
}
}
답은 맞았으나, 상당히 유사해보이는 for문이 2번 돌아, for문을 하나로 줄일 수 있는지 물어봄.
힌트 1 set.add()는 반환값이 있는데, 이 반환값이 뭘 알려주는지 확인해보면?
set.add()는 값이 있으면 false, 값이 없으면 true를 반환해주니, set.add()가 참이면, 값이 없다는 소리고, for문은 어차피 문자의 순서대로 돌고, 그 순서대로 StringBuilder에 넣어줌.
1
2
3
4
5
for(int i = 0; i < c.length; i++){
if(set.add(c[i])){
sb.append(c[i]);
}
}
따라서 위 처럼 코드를 짠다면, 문자를 앞에서 하나씩 돌면서 set에 없으면 sb에 넣고, sb를 String으로 return 해주면 됨.
2차 제출
- 성공
배운 점
- LinkedHashSet을 고른건 틀린 판단은 아니었음. 허나, 루프를 하나로 합치면서 순서를 set이 아니라, sb에 넣을 때 정해지도록 함. 즉, set이 순서를 안 지켜도 되니 HashSet보다 좀 더 느린 LinkedHashSet을 사용할 이유가 없음. 따라서, 처음 선택이 맞더라도, 코드 구조가 바뀌면 그 선택이 최선인지 다시 한번 살펴 볼 필요가 있어 보임.
최종 풀이 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.*;
class Solution {
public String solution(String my_string) {
Set<Character> set = new HashSet<>();
char[] c = my_string.toCharArray();
StringBuilder sb = new StringBuilder();
for(int i = 0; i < c.length; i++){
if(set.add(c[i])){
sb.append(c[i]);
}
}
return sb.toString();
}
}
This post is licensed under CC BY 4.0 by the author.