알고리즘 문제를 풀다보면 시간초과를 자주 경험하게 된다.
이 글을 쓰는 이유도 알고리즘 문제를 풀던 도중 시간초과를 겪었기 때문이다.
내가 풀었던 문제는 String을 반환하는 문제였고
for문을 반복하면서 String을 하나씩 더했을 때 시간초과가 발생하였다.
문제를 틀린 후 StringBuilder로 고치니 문제는 해결되었다.
그렇다면 String을 이어붙이는것과 StringBuilder에서 시간의 차이가 발생했다는 것인데,
같은 for문을 진행했음에도 왜 시간차이가 발생하는 것일까?
자바에서는 String의 값을 바꿀 수 없는 불변성을 가지고 있다.
String의 값을 바꿀 수 없는데 문자열에 + 문자열을 하면 합쳐지는 이유는 뭘까?
String에서 '+'연산이 일어나는 과정은 다음과 같다.
https://www.baeldung.com/java-string-concatenation
'+'연산을 진행하면 java컴파일러에서 내부적으로 StringBuilder클래스를 만든 후 다시 문자열로 반환한다.
이렇게 되면 StringBuilder를 처음부터 사용했을 때 보다 String에서 StringBuilder로 변환하여 문자열을 합친 후 다시 String으로 변환하는 과정이 문자열을 합칠 때 마다 반복이 된다는 것이다.
그렇게 되면 성능이 떨어지고, 메모리의 비효율이 발생하여 기하급수 적으로 큰 값이 들어올 수 있는 알고리즘 문제에서 시간초과가 발생하는 것이다.
출처
https://www.javatpoint.com/why-string-is-immutable-or-final-in-java
https://stackoverflow.com/questions/22439177/why-is-stringbuilder-much-faster-than-string
http://egloos.zum.com/deblan2/v/419830
https://dev.to/this-is-learning/performance-benchmarking-string-and-string-builder-3bid