새소식

Programmers Coding Test/Java

[프로그래머스 120888] Java - 코딩테스트 입문 / 중복된 문자 제거

  • -

 

 

중복된 문자 제거

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/120888

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

1)  문제

문자열 my_string이 매개변수로 주어집니다. 
my_string에서 중복된 문자를 제거하고 하나의 문자만 남긴 문자열을 return하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ my_string ≤ 110
my_string은 대문자, 소문자, 공백으로 구성되어 있습니다.
대문자와 소문자를 구분합니다.
공백(" ")도 하나의 문자로 구분합니다.
중복된 문자 중 가장 앞에 있는 문자를 남깁니다.

(my_string 제한사항이 아마 길이 제한사항이 아닐까...문제 오류인듯 합니다)

 

 

2)  예시

 

 

Result Table
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에 넣을 수 있을 것이지만...!

 

 

 

 

 

 

 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.