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

[프로그래머스, LV.0] 문자열 뒤집기

sundori 2023. 6. 28. 00:34

#1 문자열 뒤집기

문제설명

문자열 my_string과 정수 se가 매개변수로 주어질 때, my_string에서 인덱스 s부터 인덱스 e까지를 뒤집은 문자열을 return 하는 solution 함수를 작성해 주세요.

제한사항

 

  • my_string은 숫자와 알파벳으로만 이루어져 있습니다.
  • 1 ≤ my_string의 길이 ≤ 1,000
  • 0 ≤ s ≤ e < my_string의 길이

입출력 예

my_string s e result
"Progra21Sremm3" 6 12 "ProgrammerS123"
"Stanley1yelnatS" 4 10 "Stanley1yelnatS"

 

입출력 예 설명

#2 코드 및 알고리즘

class Solution {
    public String solution(String my_string, int s, int e) {
        String answer = my_string.substring(0, s);
        for(int i = e; i >= s; i--){
            answer += my_string.charAt(i);
        }
        answer += my_string.substring(e + 1);
        return answer;
    }
}
----------------------------------------------------
정확성  테스트
테스트 1 〉	        통과 (9.04ms, 73.4MB)
테스트 2 〉	통과 (9.17ms, 73.1MB)
테스트 3 〉	통과 (11.96ms, 74.5MB)
테스트 4 〉	통과 (12.55ms, 79.2MB)
테스트 5 〉	        통과 (13.34ms, 71.9MB)
테스트 6 〉	통과 (9.47ms, 76.7MB)
테스트 7 〉	        통과 (10.61ms, 79.4MB)
테스트 8 〉	통과 (11.26ms, 80.9MB)
테스트 9 〉	통과 (10.78ms, 78.4MB)
테스트 10 〉	통과 (11.71ms, 81.6MB)
테스트 11 〉	통과 (11.14ms, 78.1MB)
테스트 12 〉	통과 (14.54ms, 73.1MB)
테스트 13 〉	통과 (9.73ms, 77.9MB)
테스트 14 〉	통과 (9.32ms, 78.9MB)
테스트 15 〉	통과 (11.28ms, 75.1MB)
테스트 16 〉	통과 (16.58ms, 80.1MB)
테스트 17 〉	통과 (11.99ms, 74.9MB)
테스트 18 〉	통과 (9.51ms, 77.7MB)

풀이:

  • 문제에서 요구하는 사항은 주어진 my_string 문자열에서 s번 인덱스부터 e번 인덱스까지의 원소들을 뒤집으라는 것이다.
  • 따라서 substring을 이용하여 s인덱스 전가지 추출하고 for문을 이용하여 e번 인덱스부터 s번 인덱스까지 감소하며 문자열에 추가.
  • 그리고 e번 인덱스 이후에 문자열이 있을 경우를 가정하여 e+1번부터 추출하여 answer 문자열에 이어붙인다.

#2-1 코드 및 알고리즘

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
class Solution {
    public String solution(String my_string, int s, int e) {
        List<String> list = new ArrayList<>();
        list.add(my_string.substring(0, s));
        for(int i = e; i >= s; i--){
            list.add(String.valueOf(my_string.charAt(i)));
        }
        list.add(my_string.substring(e + 1));
        return list.stream().map(String::valueOf).collect(Collectors.joining());
    }
}
-------------------------------------------
정확성  테스트
테스트 1 〉	        통과 (2.68ms, 78.5MB)
테스트 2 〉	통과 (2.22ms, 78.2MB)
테스트 3 〉	통과 (2.05ms, 75.4MB)
테스트 4 〉	통과 (1.42ms, 77.3MB)
테스트 5 〉	        통과 (1.91ms, 72.6MB)
테스트 6 〉	통과 (1.87ms, 77.8MB)
테스트 7 〉	        통과 (2.04ms, 71.8MB)
테스트 8 〉	통과 (1.51ms, 72.7MB)
테스트 9 〉	통과 (1.93ms, 73.4MB)
테스트 10 〉	통과 (1.94ms, 72.4MB)
테스트 11 〉	통과 (4.17ms, 75.2MB)
테스트 12 〉	통과 (2.43ms, 72.1MB)
테스트 13 〉	통과 (2.52ms, 71.8MB)
테스트 14 〉	통과 (2.36ms, 70.9MB)
테스트 15 〉	통과 (1.90ms, 73.4MB)
테스트 16 〉	통과 (2.96ms, 77MB)
테스트 17 〉	통과 (1.44ms, 73.6MB)
테스트 18 〉	통과 (1.64ms, 80.1MB)

풀이2:

  • 처음 알고리즘과 두 번째 알고리즘에서 큰 속도 차이를 볼 수 있었다.
  • 이유는 String의 불변성 때문이다. 
    String은 참조 타입이라는데 이는 클래스라는 소리이기도하다.

코드 예제

public class Main {
    public static void main(String[] args) {
        String my_string = "Progra21Sremm3";
        int s = 6, e = 12;
        String answer = my_string.substring(0, s);
        System.out.println(answer);
        for(int i = e; i >= s; i--){
            answer += my_string.charAt(i);
            System.out.println(answer);
        }
        answer += my_string.substring(e + 1);
        System.out.println(answer);
    }
}
---------------------------------
출력결과
Progra // String answer = my_string.substring(0, s);

Program // for문 시작
Programm
Programme
Programmer
ProgrammerS
ProgrammerS1
ProgrammerS12 // for문 종료
ProgrammerS123 // answer += my_string.substring(e + 1);