본문 바로가기
CodingTest/Programmers

[프로그래머스] Lv.0 중복된 문자 제거**

by yoondoo 2022. 11. 30.
728x90
class Solution {
    public String solution(String my_string) {
       StringBuilder answer = new StringBuilder();
		
		while(true) {
			if(my_string.equals("")) {
				break;
			}else {
				answer.append(my_string.charAt(0));
				my_string = my_string.replaceAll(Character.toString(my_string.charAt(0)), "");
			}
		}
	    
        return answer.toString();
    }
}

필자는 문자열 문제만 나오면 우선 부담이 된다.

자르고 탐색하고 정렬하고 형변환하는 등 문제의 종류가 너무나 다양한데 다양한 메서드를 알아야 좀 더 문제를 쉽게 풀 수 있다고 생각하기 때문에 항상 알고 있는 클래스 메서드들을 쥐어짜내서 거기에 풀이를 생각하려고 하는 편이다.

 

위의 코드 풀이 방식은 우선 매개변수로 전달 받은 문장 ex) "We are the world" 있다고 하면

반복문을 통해 my_string이 빈 문자열이 될 때까지

해당 문자열의 첫번째 문자 처음에는 "W"를 answer에 저장해두고

my_string문자열 전체에서 "W"를 지우고

다시 문자열의 첫번째 문자 두번째에는 "e"를 answer에 저장해두고

my_string문자열 전체에서 "e"를 지우고

이런 방법을 반복해서 리턴해줄 answer를 완성시켰다.

 

그런데 indexOf()메서드를 이용해서 간단하지만 더 좋아보이는 방법인 것 같아서 다시 풀이 해보겠다.

class Solution {
    public String solution(String my_string) {
        String answer = "";
        
        for(int i=0; i<my_string.length(); i++) {
			if(i==my_string.indexOf(my_string.charAt(i))) {
				answer += my_string.charAt(i);
			}
		}
        
        return answer;
    }
}

먼저 indexOf()메서드는 블로그 글들을 보면 파라미터로 int나 String을 받는다고 되어 있는데 charAt()매서드는 인자로 전달받은 인덱스에 위치한 '문자'를 반환하는 것으로 알고 있어서 헷갈렸다.

 

근데 생각해보니 char타입은 실제 문자를 저장하는 것이 아닌 유니코드를 저장하기 때문에 int파라미터로 쓰일 수 있겠다고 생각했다. 

 

indexOf()는 특정 문자나 문자열을 앞에서부터 찾아서 찾으면 특정 인덱스를 반환하고 못 찾으면 -1을 반환한다.

 

그렇게 되면

ex) "We are the world"

i : 0 일 때 if( o == my_string.indexOf('W'의 유니코드) my_string에 0번째에 존재) => ( 0 == 0 )

answer = "W"

가 되고

만약 i가 5일 때는

i : 5 if( 5 == my_string.indexOf('e'의 유니코드))

근데 indexOf는 앞에서 부터 찾기 때문에 5번째 e를 만나기 전인 1번째 e를 먼저 찾았다고 판단해서 1을 반환한다.

결국 if( 5 == 1 ) 조건이 거짓이므로 answer에 추가되지 않고 i는 증가 된다.

 

이런식으로 굳이 하나의 문자를 찝어서 문자열에서 지우고 반복할 필요 없이 indexOf()메서드의 찾는 문자나 문자열을 앞에서 부터 검색해 인덱스를 반환하는 기능을 이용해서 문제를 풀 수 있다.

반응형

댓글