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

[프로그래머스, LV.0] rny_string

sundori 2023. 5. 15. 21:56

목차

     

    #1 rny_string

    문제 설명

    제한 사항

    • 1 <= rny_string의 길이 <= 100
    • rny_string은 영소문자로만 이루어져 있습니다.

    입출력 예

    #2 코드 및 알고리즘

    class Solution {
        public String solution(String rny_string) {
            String arr = ""; // 새로 바뀐 문자열을 저장할 문자열 변수.
            for(int i = 0; i < rny_string.length(); i++)
                if(rny_string.charAt(i) == 'm')
                    arr += "rn";
                else
                    arr += rny_string.charAt(i);
            return arr;
        }
    }
    -----------------------------------------------------------
    원본 :masterpiece
    수정 본 :rnasterpiece
    테스트 1 〉	통과 (11.95ms, 76.9MB)
    테스트 2 〉	통과 (11.87ms, 74.6MB)
    테스트 3 〉	통과 (9.88ms, 75.8MB)
    테스트 4 〉	통과 (16.27ms, 77.3MB)
    테스트 5 〉	통과 (11.67ms, 84.6MB)
    테스트 6 〉	통과 (15.89ms, 65.5MB)
    테스트 7 〉	통과 (12.75ms, 75MB)
    테스트 8 〉	통과 (10.67ms, 74.1MB)
    테스트 9 〉	통과 (9.97ms, 71.3MB)
    테스트 10 〉	통과 (11.52ms, 79.8MB)
    테스트 11 〉	통과 (12.15ms, 79.4MB)
    테스트 12 〉	통과 (9.65ms, 79MB)
    테스트 13 〉	통과 (13.93ms, 80.4MB)
    테스트 14 〉	통과 (10.09ms, 79.1MB)
    테스트 15 〉	통과 (10.49ms, 78.1MB)
    테스트 16 〉	통과 (10.08ms, 77.8MB)
    테스트 17 〉	통과 (2.16ms, 76.4MB)
    테스트 18 〉	통과 (9.55ms, 75.8MB)
    테스트 19 〉	통과 (2.00ms, 66.7MB)
    테스트 20 〉	통과 (9.58ms, 75.1MB)
    채점 결과
    정확성: 100.0
    합계: 100.0 / 100.0

    위의 코드의 경우 메소드를 사용하지 않고 for문을 이용하여 새로운 문자열에 붙여넣기 식으로 짠 코드이다. 
    이런 식의 단점은 컴파일 시간이 은근 길다는 점이다. 이러한 이유는 문자열에 이어붙이는 + 연산자는 기존의 문자열에 이어붙이는 것이 아닌 새로운 String 클래스 객체 문자열을 만들어 저장하고,  그 객체를 참조한다는 것이다.
    풀이:
    1. for문을 통해 rny_string의 길이만큼 루프 반복.
    2. if-else문을 통해 만약 'm'과 같다면 "rn"을 붙이며 아니라면 rny_string.charAt(i)를 이어붙인다.

    #3 java.replace(CharSequence target, CharSequence replacement)

    class FirstJava {
        public static void main(String[] args) {
            String rny_string = "programmer";
            String arr = rny_string.replace("m", "rn");
            System.out.println("원본 :" + rny_string);
            System.out.println("수정 본 :" + arr);
        }
    }
    ---------------------------------------------------
    원본 :programmer
    수정 본 :prograrnrner
    -----------------------------
    테스트 1 〉	통과 (0.06ms, 71.9MB)
    테스트 2 〉	통과 (0.03ms, 73.4MB)
    테스트 3 〉	통과 (0.05ms, 73.2MB)
    테스트 4 〉	통과 (0.03ms, 77.3MB)
    테스트 5 〉	통과 (0.04ms, 77.8MB)
    테스트 6 〉	통과 (0.03ms, 73.6MB)
    테스트 7 〉	통과 (0.02ms, 74.5MB)
    테스트 8 〉	통과 (0.03ms, 72.5MB)
    테스트 9 〉	통과 (0.04ms, 74.8MB)
    테스트 10 〉	통과 (0.03ms, 74.5MB)
    테스트 11 〉	통과 (0.04ms, 78.6MB)
    테스트 12 〉	통과 (0.05ms, 71.8MB)
    테스트 13 〉	통과 (0.03ms, 78.5MB)
    테스트 14 〉	통과 (0.06ms, 76.3MB)
    테스트 15 〉	통과 (0.04ms, 74.8MB)
    테스트 16 〉	통과 (0.03ms, 72.6MB)
    테스트 17 〉	통과 (0.06ms, 81.2MB)
    테스트 18 〉	통과 (0.02ms, 72.2MB)
    테스트 19 〉	통과 (0.03ms, 74MB)
    테스트 20 〉	통과 (0.04ms, 76.4MB)
    채점 결과
    정확성: 100.0
    합계: 100.0 / 100.0

    속도 차이가 보인다.

    #3-1 java.replaceAll(String regex, String replacement)

    class FirstJava {
        public static void main(String[] args) {
            String rny_string = "programmer";
            String arr = rny_string.replaceAll("m", "rn");
            System.out.println("원본 :" + rny_string);
            System.out.println("수정 본 :" + arr);
        }
    }
    -------------------------------------------------------
    원본 :programmer
    수정 본 :prograrnrner
    -----------------------------------
    테스트 1 〉	통과 (0.08ms, 78.1MB)
    테스트 2 〉	통과 (0.07ms, 66.4MB)
    테스트 3 〉	통과 (0.06ms, 66MB)
    테스트 4 〉	통과 (0.06ms, 75MB)
    테스트 5 〉	통과 (0.09ms, 76.7MB)
    테스트 6 〉	통과 (0.07ms, 70.4MB)
    테스트 7 〉	통과 (0.08ms, 71.5MB)
    테스트 8 〉	통과 (0.07ms, 70.8MB)
    테스트 9 〉	통과 (0.07ms, 72.5MB)
    테스트 10 〉	통과 (0.10ms, 75.9MB)
    테스트 11 〉	통과 (0.12ms, 72MB)
    테스트 12 〉	통과 (0.10ms, 74MB)
    테스트 13 〉	통과 (0.17ms, 72.8MB)
    테스트 14 〉	통과 (0.09ms, 69.3MB)
    테스트 15 〉	통과 (0.14ms, 72.5MB)
    테스트 16 〉	통과 (0.08ms, 72.5MB)
    테스트 17 〉	통과 (0.34ms, 76MB)
    테스트 18 〉	통과 (0.06ms, 77.3MB)
    테스트 19 〉	통과 (0.06ms, 71.2MB)
    테스트 20 〉	통과 (0.12ms, 76.4MB)
    채점 결과
    정확성: 100.0
    합계: 100.0 / 100.0

    #3-2 replace와 replaceAll의 차이점

    이렇게 본다면 차이가 없어 보인다. 하지만 밑에 코드를 보면 차이를 알게될 것이다.

    class FirstJava {
        public static void main(String[] args) {
            String rny_string = "p.r.o.g.r.a.m.m.e.r";
            String arr = rny_string.replace(".", "/");
            String arr1 = rny_string.replaceAll(".", "/");
            System.out.println("원본 :" + rny_string);
            System.out.println("수정 본 replace :" + arr);
            System.out.println("수정 본 replaceAll :" + arr1);
        }
    }
    -------------------------------------------------------
    원본 :p.r.o.g.r.a.m.m.e.r
    수정 본 replace :p/r/o/g/r/a/m/m/e/r
    수정 본 replaceAll :///////////////////

    특수문자를 이용할 때 차이가 보인다. CharSequence String의 차이로 인자 값의 형태가 다르다 그리고 regex가 보이는데 이는 
    "정규 표현식"을 말한다.
    정규 표현식이란?
    텍스트를 기술하기 위한 표현 방식으로 특정한 문자열의 검색, 치환, 추출에 있어 효과적이다.
    즉, 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용되는 언어이다!