[프로그래머스/181905] 문자열 뒤집기

☑️ 문제

프로그래머스 181905

☑️ 풀이

첫 번째 풀이

  • 구간을 세 개로 나누어서 substring() 메서드로 문제를 해결하였다.
//시간: 35.20ms
//메모리: 88.1MB

class Solution {
    public String solution(String my_string, int s, int e) {
        String answer = "";

        String start = my_string.substring(0, s);
        String middle = my_string.substring(s, e + 1);
        String end = my_string.substring(e + 1);
        String newM = "";
        for (int i = e; i >= s; i--) {
            newM += my_string.charAt(i);
        }

        answer += start;
        answer += newM;
        answer += end;

        return answer;
    }
}
  • 가운데 구간을 뒤집는 과정이나 세 구간을 다시 이어붙이는 과정이 불필요하게 길었고, 다른 사람의 풀이를 보면서 다시 풀어보았다.

두 번째 풀이

  • StringBuilderreverse() 메서드를 사용해서 풀었다.
//시간: 13.02ms
//메모리: 80.9MB

class Solution {
    public String solution(String my_string, int s, int e) {
        StringBuilder sb = new StringBuilder(my_string.substring(s, e + 1));
        sb.reverse();
        return my_string.substring(0, s) + sb + my_string.substring(e + 1);
    }
}

☑️ 문법 정리 - StringBuilder

StringBuilder

  • 가변적인 문자열을 처리하기 위한 클래스 - 문자열과 문자열을 더하거나 변경하게 되면 새로운 객체를 생성하는 것이 아니라 기존의 데이터에 추가 및 변경된다.
  • 속도가 빠르며 상대적으로 부하가 적다.

생성자

StringBuilder sb = new StringBuilder(); // 기본 생성자
StringBuilder sb = new StringBuilder(20); // 사이즈를 지정하여 생성
StringBuilder sb = new StringBuilder("hello"); // 문자열을 인자로 받아서 생성

append()

  • 문자열 추가
StringBuilder sb = new StringBuilder("Hello");
sb.append(" world");
System.out.println(sb); // Hello world

insert(index, str)

  • 특정 인덱스 위치(index)에 문자열(str) 삽입
StringBuilder sb = new StringBuilder("He World");
sb.insert(2, "llo") // 2번 인덱스에 "llo" 문자열 삽입
System.out.println(sb); // Hello world

delete(startIndex, endIndex)

  • 시작 인덱스(startIndex)부터 종료 인덱스(endIndex) 사이의 문자열 제거
  • 문자열에서 시작과 끝은 항상 시작 ≤ 범위 < 끝 형태
StringBuilder sb = new StringBuilder("Hello world");
sb.delete(6, 9); // 6번 인덱스부터 9번 인덱스 전까지 삭제
System.out.println(sb); // Hello ld

deleteCharAt(index)

  • 특정 인덱스의 한 문자만 삭제
StringBuilder sb = new StringBuilder("Hello");
sb.deleteCharAt(4); // 4번 인덱스 위치의 문자 삭제
System.out.println(sb); // Hell

reverse()

  • 문자열을 역순으로 변경
StringBuilder sb = new StringBuilder("Hello");
sb.reverse();
System.out.println(sb); // olleH

capacity()

  • String 클래스와 다르게 char[] 배열 사이즈를 여유롭게 잡아줌
  • 현재 char[] 배열이 가진 사이즈 정보를 리턴
  • length()는 실제 데이터가 들어있는 문자열의 길이이고, capacity()는 현재 배열 사이즈
  • append() 등 문자열 조정 시 배열 사이즈가 자동으로 변경됨
StringBuilder sb = new StringBuilder("Hello");
System.out.println(sb.length()); // 5
System.out.println(sb.capacity()); // 21

setCharAt(index, str)

  • 특정 인덱스의 문자를 변경
StringBuilder sb = new StringBuilder("Hello");
sb.setCharAt(0, 'h');
System.out.println(sb); // hello

setLength()

  • 문자열 길이 조정
  • 현재 문자열보다 길게 조정 시 공백으로 채워짐
  • 현재 문자열보다 짧게 조정 시 나머지 문자는 삭제됨
StringBuilder sb = new StringBuilder("Hello World");
sb.setLength(9); 
System.out.println(sb + "끝"); // Hello Wor끝

sb.setLength(11); 
System.out.println(sb + "끝"); // Hello Wor  끝

© 2021. All rights reserved.

yaejinkong의 블로그