본문 바로가기
개발/개발 공부

[프로그래머스] 코딩테스트 입문 : 특정 문자 제거하기

by 하모예 2024. 9. 5.

| 문제

문자열 my_string과 문자 letter이 매개변수로 주어집니다.

my_string에서 letter를 제거한 문자열을 return 하도록 solution 함수를 완성해 주세요.

| 제한 사항

  • 1 ≤ my_string의 길이 ≤ 100
  • letter는 길이가 1인 영문자입니다.
  • my_stringletter는 알파벳 대소문자로 이루어져 있습니다.
  • 대문자와 소문자를 구분합니다.

| 입출력 예

my_string letter result
"abcdef" "f" "abcde"
"BCBdbe" "B" "Cdbe"

| 힌트

문자열을 통해 해결해야 하는 문제는 일단 문자열을 잘라야 합니다. 

문자열을 잘라서 배열에 넣어보세요. 

그런 다음 반복문을 통해 잘린 문자열을 StringBuilder로 합쳐보세요.

StringBuilder로 합쳐질 때 letter로 제공된 문자열을 제외하려면 어떻게 해야 할까요?

| 풀이 1

가장 직관적으로 작성된 풀이입니다.

주어진 문자열 my_string을 잘라서 문자열 배열에 넣고

반복문을 통해 조회하면서 StringBuilder에 붙입니다.

이때, StringBuilder에 붙이려는 문자열이

주어진 문자열 letter와 같지 않을 때만 붙이게 조건문을 추가하였지요.

public String solution01(String my_string, String letter) {
    StringBuilder sb = new StringBuilder();
    for(String s : my_string.split("")){
        if(!s.equals(letter)) sb.append(s);
    }
    return sb.toString();
}

| 풀이 2

""을 기준으로 문자열을 split 하면 단순히 한 글자 한 글자가 배열의 값으로 들어가게 됩니다. 

그렇다면 letter를 split의 기준으로 잡으면 어떨까요?

split 메서드의 매개변수로 주어지는 값을 문자열을 자르는 기준으로 삼기 때문에

자연스럽게 my_string에서 letter가 제거됩니다.

public String solution02(String my_string, String letter) {
    StringBuilder sb = new StringBuilder();
    for(String s : my_string.split(letter)){
        sb.append(s);
    }
    return sb.toString();
}

| 풀이 3

String이 가진 메소드 중에 replace라는 친구가 있습니다.

replace 메서드는 두 개의 매개변수를 필요로 해요.

첫 번째는 바꿀대상이 되는 값, 두 번째는 어떻게 바뀔지를 적으면 되지요.

그래서 첫 번째에 letter, 두 번째에 비어있는 문자열을 넣으면

my_string에서 letter가 제거된 문자열을 도출할 수 있습니다. 

public String solution03(String my_string, String letter) {
    return my_string.replace(letter,"");
}

| 해설

풀이 1, 풀이 2, 풀이 3 순서대로 평균 0.201, 0.0905, 0.0325ms 정도의 시간이 소요되었습니다.

잘린 문자열을 다시 붙이는 데에 StringBuilder의 append메서드만큼 좋은 방법이 없지만

역시나 문자열 자체로 처리할 수 있는 replace의 성능을 따라잡지는 못하네요.

클래식이 답이라는 것을 다시 한번 느끼게 해주는 문제였습니다.

댓글