오늘 코딩테스트 문제를 풀다가 문자열을 뒤집는 문제를 만났다.
바로 아래의 코드는 내가 작성한 방식이다.
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);
}
return answer;
}
}
물론 이 방식도 동작은 한다.
하지만 다른 사람들의 풀이를 보니 대부분 StringBuilder의 reverse() 메서드를 사용하고 있었다.
class Solution {
public String solution(String my_string) {
return new StringBuilder(my_string)
.reverse()
.toString();
}
}
StringBuilder의 존재는 알고 있었지만 평상시에 필요성을 크게 체감하지는 못했었다.
하지만 다른 사람들의 풀이를 보고 StringBuilder의 강력함과 효율성에 대해서 알게 되었다.
String은 불변(immutable) 객체
Java의 String은 한 번 생성되면 내부 값을 변경할 수 없다.
즉 아래 코드처럼 보이더라도:
answer += "a";
실제로는:
- 기존 문자열 유지
- 새로운 문자열 생성
- 새로운 문자열 반환
과정을 반복한다.
문자열을 계속 수정하는 상황에서는 비효율적일 수 있다.
StringBuilder는 문자열을 수정 가능한 객체
StringBuilder는 문자열을 계속 변경할 수 있도록 만들어진 클래스다.
대표적으로:
- append()
- insert()
- delete()
- reverse()
같은 메서드를 제공한다.
예:
StringBuilder sb = new StringBuilder("hello");
sb.reverse();
System.out.println(sb);
출력:
olleh
왜 코딩테스트에서 많이 사용할까?
코딩테스트에서는:
- 문자열 뒤집기
- 문자열 이어 붙이기
- 문자 수정
같은 작업이 자주 나온다.
이때 String을 반복해서 수정하면 성능이 비효율적일 수 있기 때문에, 대부분 StringBuilder를 많이 사용한다.
특히:
answer += 문자
를 반복하는 방식은 문자열이 계속 새로 생성되기 때문에 성능상 좋지 않다.
오늘 느낀 점
오늘 공부하면서 느낀 건, 코딩테스트는 단순히 문법만 아는 것으로 해결되지 않는다는 점이었다.
다른 사람의 풀이를 보면:
- StringBuilder
- HashMap
- Arrays.sort()
같은 Java의 다양한 도구들을 자연스럽게 활용하고 있었다.
처음에는 “이걸 어떻게 다 알지?”라는 생각이 들었지만, 결국 중요한 건 문제 상황과 자주 쓰이는 패턴을 연결해서 익히는 것이라는 것을 알게 되었다. 더욱더 많은 양의 코드를 접하고 공부만이 살 길이라는 깨달음을 얻게 되었다.