이지은님의 블로그
[Java] 프로그래머스 문제 풀이 - 뒤집힌 문자열 본문
1️⃣ 뒤집힌 문자열 (https://school.programmers.co.kr/learn/courses/30/lessons/120822)
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문자열 my_string이 매개변수로 주어집니다. my_string을 거꾸로 뒤집은 문자열을 return하도록 solution 함수를 완성해주세요.
👉 처음 푼 방법 : substring을 사용하는 방법
class Solution {
public String solution(String my_string) {
String answer = "";
for (int i = my_string.length() - 1; i >= 0; i--) {
answer += my_string.substring(i, i + 1); // 통과 (1.50ms, 90.3MB)
}
return answer;
}
}
반복문으로 반복 + substring 사용 + String을 더함으로 문자열이 생성될 때마다 메모리 사용
-> 통과 (1.50ms, 90.3MB)
👉 두번째 방법 : charAt을 사용하는 방법
class Solution {
public String solution(String my_string) {
String answer = "";
for (int i = my_string.length() - 1; i >= 0; i--) {
answer += my_string.charAt(i); // 통과 (8.61ms, 87.2MB)
}
return answer;
}
}
반복문으로 반복 + charAt 사용(Char형으로 변환하여 가져옴) + String을 더함으로 문자열이 생성될 때마다 메모리 사용
-> 통과 (8.61ms, 87.2MB)
👉 세번째 방법 : StringBuilder의 reverse를 사용하는 방법
import java.util.*;
class Solution {
public String solution(String my_string) {
return new StringBuilder(my_string).reverse().toString(); // 통과 (0.03ms, 71.8MB)
}
}
StringBuilder의 reverse()메서드를 사용하여 문자열을 뒤집을 수 있음 (시간 절약으로 이익)
-> 통과 (0.03ms, 71.8MB)
💬 왜 StringBuilder는 시간 절약을 할 수 있을까?
📌 String은 불변(immutable) 객체이고, StringBuilder는 가변(mutable) 객체
- String은 새로운 문자열 객체를 생성해서 참조를 바꾸는 것 -> 이로 인해 시간이 오래 걸리고 메모리도 낭비
- StringBuilder.reverse()는 내부 char[] 배열을 in-place로 뒤집음 -> 추가적인 문자열 생성 없이 효율적인 연산 수행
- 멀티스레드 환경이라면 StringBuffer가 스레드 세이프라 더 적합함
항목 | String | StringBuilder | StringBuffer |
가변 여부 | ❌ 불변 (Immutable) | ✅ 가변 (Mutable) | ✅ 가변 (Mutable) |
속도 | ⛔ 느림 (매번 새 객체 생성) | ✅ 가장 빠름 | ⏱ 중간 (동기화 오버헤드 존재) |
스레드 안전성 | ❌ 스레드 안전하지 않음 | ❌ 스레드 안전하지 않음 | ✅ 스레드 안전 (동기화 지원) -> 멀티 스레드 환경에서 사용 |
'알고리즘 공부 > [JAVA] 코드카타' 카테고리의 다른 글
[Java] 프로그래머스 문제 풀이 - 배열 자르기, 점의 위치 구하기, 아이스 아메리카노, 짝수는 싫어요 (Arrays.copyOfRange, ArrayList, IntStream.rangeClosed) (0) | 2025.05.29 |
---|---|
[Java] 프로그래머스 문제 풀이 - 최댓값 만들기 (1), 모음 제거, 자릿수 더하기, 머쓱이보다 키 큰 사람 (Arrays.sort(), Arrays.stream()) (0) | 2025.05.20 |
[JAVA] 코드카타 - (61)~(65) (0) | 2025.02.04 |
[JAVA] 코드카타 - (56)~(60) (1) | 2025.01.29 |
[JAVA] 코드카타 - (51)~(55) (0) | 2025.01.23 |