중복된 문자 제거
https://school.programmers.co.kr/learn/courses/30/lessons/120888
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1) 문제
my_string에서 중복된 문자를 제거하고 하나의 문자만 남긴 문자열을 return하도록 solution 함수를 완성해주세요.
1 ≤ my_string ≤ 110
my_string은 대문자, 소문자, 공백으로 구성되어 있습니다.
대문자와 소문자를 구분합니다.
공백(" ")도 하나의 문자로 구분합니다.
중복된 문자 중 가장 앞에 있는 문자를 남깁니다.
(my_string 제한사항이 아마 길이 제한사항이 아닐까...문제 오류인듯 합니다)
2) 예시
my_string | result |
---|---|
"people" | "peol" |
"We are the world" | "We arthwold" |
입출력 예 #1
"people"에서 중복된 문자 "p"와 "e"을 제거한 "peol"을 return합니다.
입출력 예 #2
"We are the world"에서 중복된 문자 "e", " ", "r" 들을 제거한 "We arthwold"을 return합니다.
3) 풀이
1. 클래스 선언을 해줍니다
● class Solution {
클래스명은 대문자로 시작해야하고, 정답이라는 의미로 Solution이라는 단어를 사용하였습니다.
2. 문자열 my_string을 매개변수로 하는 solution 메소드를 선언합니다.
solution은 문자열을 반환하므로 데이터타입을 String으로 합니다.
● public String solution(String my_string) {
3. StringBuilder 객체 result를 생성합니다.
for반복문을 이용하여 my_string의 문자 하나하나를 char c에 저장하고,
result.indexOf 메소드를 이용하여, 괄호안의 값에 하는 가장 처음에 위치한 인덱스 값을 구합니다.
만약 그 값이 없다면 -1을 반환하게됩니다.
여기서 변수값은 String.valueOf(c)로, char c를 String으로 변환하는 과정입니다. (char과 String 비교불가)
즉, 해당하는 인덱스 값이 없다는 말은 result 안에 그 원소가 없으므로 추가해주면 됩니다.
있다면 인덱스 값이 나오므로 추가해주지 않으면 중복처리가 되는 것이지요.
최종적으로 StringBuilder객체 result를 String으로 형변환하여 반환합니다.
● StringBuilder result = new StringBuilder();
for (int i = 0; i < my_string.length(); i++) {
char c = my_string.charAt(i);
if (result.indexOf(String.valueOf(c)) == -1) {
result.append(c);
}
}
return result.toString();
}
}
4) 코드
class Solution {
public String solution(String my_string) {
StringBuilder result = new StringBuilder();
for (int i = 0; i < my_string.length(); i++) {
char c = my_string.charAt(i);
if (result.indexOf(String.valueOf(c)) == -1) {
result.append(c);
}
}
return result.toString();
}
}
5) 느낀점
indexOf가 String 클래스의 메소드라 StringBuilder 객체인 result를 string으로 변환해야 사용이 가능하다는 사실을 알았습니다.
그리고 다른 사람들이 어떻게 이 문제를 해결하였나보니 아래와 같은 두가지 방법을 더 확인할 수 있었습니다.
* contains 메소드를 이용하여 중복 확인
class Solution {
public String solution(String my_string) {
String answer = "";
for(int i=0; i<my_string.length(); i++){
if(!answer.contains(String.valueOf(my_string.charAt(i)))){
answer += my_string.charAt(i);
}
}
return answer;
}
}
마찬가지로 my_string의 문자 하나하나를 분해하여 그 값을 string 변환하여 answer 문자열 내에 포함되어있나 여부를 확인하고, 없다면 answer 문자열에 추가하는 방식을 채택하였습니다.
* HashSet 자료구조를 이용하여 중복 확인
import java.util.HashSet;
class Solution {
public String solution(String my_string) {
HashSet<Character> uniqueChars = new HashSet<>();
StringBuilder result = new StringBuilder();
for (char c : my_string.toCharArray()) {
if (!uniqueChars.contains(c)) {
result.append(c);
uniqueChars.add(c);
}
}
return result.toString();
}
}
HashSet 자료구조는 중복원소를 허용하지 않습니다.
그래서 for반복문으로 HashSet을 확인했을 때 my_stringd의 charAt(i)가 없다면 result에 추가, HashSet에도 추가하는 방식을 채택하였습니다. 사실 위랑 크게 차이는 없을 것 같습니다.
HashSet은 중복을 허용하지 않는 구조인데, contains로 또 확인을 하는 것은 이차검증이 아닐까 싶습니다.
물론 여부를 확인해야 result에 넣을 수 있을 것이지만...!
'Programmers Coding Test > Java' 카테고리의 다른 글
[프로그래머스 120891] Java - 코딩테스트 입문 / 369게임 (1) | 2024.02.19 |
---|---|
[프로그래머스 120890] Java - 코딩테스트 입문 / 가까운 수 (0) | 2024.02.19 |
[프로그래머스 120853] Java - 코딩테스트 입문 / 컨트롤 제트 (0) | 2024.02.19 |
[프로그래머스 120899] Java - 코딩테스트 입문 / 가장 큰 수 찾기 (1) | 2024.02.19 |
[프로그래머스 120893] Java - 코딩테스트 입문 / 대문자와 소문자 (0) | 2024.02.18 |