극동대학교\AI컴퓨터공학과\JAVA/프로그래머스 코딩 기초 트레이닝

[프로그래머스, LV.0] 글자 지우기

sundori 2023. 9. 4. 15:13

목차

    #1 글자 지우기

    문제 설명

    문자열 my_string과 정수 배열 indices가 주어질 때, my_string에서 indices의 원소에 해당하는 인덱스의 글자를 지우고 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.

    제한사항

    • 1 ≤ indices의 길이 < my_string의 길이 ≤ 100
    • my_string은 영소문자로만 이루어져 있습니다
    • 0 ≤ indices의 원소 < my_string의 길이
    • indices의 원소는 모두 서로 다릅니다.

    입출력 예

    my_string indices result
    "apporoograpemmemprs" [1, 16, 6, 15, 0, 10, 11, 3] "programmers"

    #2 알고리즘 및 코드

    import java.util.Arrays;
    class Solution {
        public String solution(String my_string, int[] indices) {
            Arrays.sort(indices);
            StringBuffer stringBuffer = new StringBuffer();
            stringBuffer.append(my_string);
            for(int i = 0; i < indices.length; i++){
                stringBuffer.deleteCharAt(indices[i] - i);
            }
            return stringBuffer.toString();
        }
    }
    --------------------------
    정확성  테스트
    테스트 1 〉	통과 (1.08ms, 80.2MB)
    테스트 2 〉	통과 (1.06ms, 73.2MB)
    테스트 3 〉	통과 (1.20ms, 66.7MB)
    테스트 4 〉	통과 (0.50ms, 75.7MB)
    테스트 5 〉	통과 (0.93ms, 75.4MB)
    테스트 6 〉	통과 (1.11ms, 74.4MB)
    테스트 7 〉	통과 (0.41ms, 76.7MB)
    테스트 8 〉	통과 (1.34ms, 68.4MB)
    테스트 9 〉	통과 (0.40ms, 74.9MB)
    테스트 10 〉	통과 (0.44ms, 71.6MB)
    테스트 11 〉	통과 (0.56ms, 80.2MB)
    테스트 12 〉	통과 (0.63ms, 74.4MB)
    테스트 13 〉	통과 (0.48ms, 71.6MB)
    테스트 14 〉	통과 (0.69ms, 78.8MB)
    테스트 15 〉	통과 (0.46ms, 73.2MB)
    테스트 16 〉	통과 (0.53ms, 73.9MB)
    테스트 17 〉	통과 (0.42ms, 73.1MB)
    테스트 18 〉	통과 (0.47ms, 72.1MB)
    • 특정 문자열에서 특정 위치의 문자를 삭제하는 방법을 사용하기 위해 StringBuffer를 사용하였다.
    • StringBuffer 클래스에서는 특정 위치의 문자열을 삭제할 수 있는 메서드 deleteCharAt을 제공한다.
    • 이 메소드의 매개변수는 정수이며 반환값은 StringBuffer이다.

    # StringBuffer

    StringBuffer를 사용하는 이유.

    String 클래스의 인스턴스는 한 번 생성되면 그 값을 읽기만 할 수 있고, 변경할 수는 없다.(Read-Only)

    이러한 문제점을 해결하기 위해 StringBuffer 클래스의 인스턴스를 사용한다.

    StringBuffer 클래스의 인스턴스는 값을 수정하거나, 추가할 수 있다

    그리고 String 인스턴스의 문자열은 덧셈(+) 연산자로 결합이 가능한데 이 때, 합쳐진 문자열은 새로운 String 인스턴스를 생성하게 된다. 덧셈 연산자를 통해 문자열과 함께 사용하면 자동으로 문자열 형변환이 이뤄지고 문자열이 결합된다.

    즉, 문자열을 결합할수록 공간이 낭비될 뿐만 아니라 실행 속도도 매우 느려지게 된다.

    # StringBuffer 메소드의 종류

    append()

    append()는 전달받은 매개변수를 가장 뒤에 추가한다.

    String 클래스의 concat과 같은 결과를 반환하지만 문자열을 이어붙이는 방식에 있어서 차이가 있어 속도가 훨씬 빠르다.

    public class Main {
        public static void main(String[] args) {
            StringBuffer stringBuffer = new StringBuffer("Hello");
            System.out.println(stringBuffer); 
            stringBuffer.append(" World!");
            System.out.println(stringBuffer);
        }
    }
    --------------------
    Hello
    Hello World!

    capacity()

    할당된 버퍼의 크기를 반환.

    public class Main {
        public static void main(String[] args) {
            StringBuffer stringBuffer = new StringBuffer();
            StringBuffer stringBuffer1 = new StringBuffer("Hello");
            StringBuffer stringBuffer2 = new StringBuffer("World!");
    
            System.out.println(stringBuffer.capacity());
            System.out.println(stringBuffer1.capacity());
            System.out.println(stringBuffer2.capacity());
        }
    }
    ---------------------
    16
    21
    22

    delete()

    문자열에서 내가 원하는 부분을 제거할 수 있다.

    public class Main {
        public static void main(String[] args) {
            StringBuffer stringBuffer = new StringBuffer("Hello World!");
    
            System.out.println(stringBuffer);
            System.out.println(stringBuffer.delete(6, 12));
        }
    }
    -----------------
    Hello World!
    Hello

    deleteCharAt()

    문자열에서 내가 원하는 문자 한 개를 제거할 수 있다.

    public class Main {
        public static void main(String[] args) {
            StringBuffer stringBuffer = new StringBuffer("Hello World!");
    
            System.out.println(stringBuffer);
            System.out.println(stringBuffer.deleteCharAt(11));
        }
    }
    ---------------
    Hello World!
    Hello World

    insert()

    내가 원하는 위치에 원하는 문자열을 추가할 수 있다.

    public class Main {
        public static void main(String[] args) {
            StringBuffer stringBuffer = new StringBuffer("Hello orld!");
    
            System.out.println(stringBuffer);
            System.out.println(stringBuffer.insert(6, "w"));
        }
    }
    --------------
    Hello orld!
    Hello world!