1. 해결 전략
- for 루프를 통해
my_string
길이만큼 i
를 증가시키며 반복
- 문자열
my_string
데이터를 s
길이까지 복사합니다.
my_string
을 s
길이만큼 복사 후 overwrite_string
문자열을 복사합니다. 이때 현재까지 복사한 문자열 길이가 문자열 my_string
의 길이를 초과하면 안되므로 i
를 증가시켜 나중에 확인해 줍니다.
overwrite_string
복사 후 i
를 통해 my_string
길이를 초과하였으면 반복문이 종료되고, 초과하지 않았다면 i
번째부터 my_string
길이까지 남은 문자열을 복사하게 됩니다.
2. 구현코드
✅ .charAt()
class Solution {
public String solution(String my_string, String overwrite_string, int s) {
String answer = "";
for(int i = 0; i < my_string.length(); i++){
if(i == s){
for(int k = 0; k < overwrite_string.length(); k++){
answer += overwrite_string.charAt(k);
i++;
}
}
if(i < my_string.length())
answer += my_string.charAt(i);
}
return answer;
}
}
3. 시간 & 공간 복잡도
- 시간 복잡도 : O(n + m) = O(n)
- 공간 복잡도 : O(n + m) = O(n)
4. Refactoring
✅ StringBuilder 사용
class Solution {
public String solution(String my_string, String overwrite_string, int s) {
StringBuilder answer = new StringBuilder();
for (int i = 0; i < my_string.length(); i++) {
if (i == s) {
answer.append(overwrite_string);
i += overwrite_string.length() - 1;
} else {
answer.append(my_string.charAt(i));
}
}
return answer.toString();
}
}
- 가변하는 문자열을 위해
StringBuilder
를 사용하여 효율적으로 문자열을 가공합니다.
if (i == s)
일 때 overwrite_string
을 한 번에 append
하여 추가합니다. 그리고 i
를 overwrite_string
길이만큼 증가하여 줍니다.
- else 블록에서는
my_string
문자를 그대로 append
합니다.
[ String ]
String 클래스
의 인스턴스는 불변(immutable)이기 때문에 수정할 때마다 기존 메모리에 복사되는 것이 아닙니다.
- 문자열을 수정하면 실제로는 새로운 String 생성되고 이전 문자열은 가비지 컬렉터로 들어갑니다. 이로 인해 수정 작업이 필요한 경우 메모리에 새로운 문자열을 할당하는 것은 피할 수 없습니다.
[ StringBuilder ]
StringBuilder 클래스
는 가변성(mutable)을 가지며 내부적으로 버퍼를 사용하여 문자열을 조작합니다.
- 문자열 수정 작업이 필요한 경우 StringBuilder는 기존 버퍼를 재사용하며 필요한 수정 작업을
String 클래스
보다 더 효율적으로 수행할 수 있습니다.
- 이로 인해 문자열 수정 작업이 많은 상황에서 StringBuilder를 사용하면 메모리 할당과 복사 작업을 효율적으로 관리할 수 있습니다.
[ StringBuilder ] vs [ StringBuffer ]
StringBuffer
와 StringBuilder
는 둘 다 가변 문자열을 다루는 클래스로, 문자열 수정 작업을 수행할 수 있습니다.
- 멀티스레드 환경에서 StringBuffer는 스레드 간의 동기화를 지원하여 데이터의 일관성과 안정성을 보장해주는 클래스입니다.
- StringBuilder는 동기화를 지원하지 않기 때문에 멀티스레드 환경에서는 추가적인 동기화 작업이 필요합니다.
✅ Substring 사용
class Solution {
public String solution(String my_string, String overwrite_string, int s) {
String first = my_string.substring(0, s);
String end = my_string.substring(overwrite_string.length() + s);
return first + overwrite_string + end;
}
}
.substring
을 사용하여 복사할 문자열 my_string
앞부분과 뒷부분을 나누어 복사합니다.
- 앞부분 문자열
first
와 중간 문자열 my_string
, 뒷부분 문자열 end
를 연산하여 원하는 반환값을 도출합니다.
5. 후기 및 반성
- 처음 날것의 코드로 문제를 해결할 수 있었지만 문자열 수정에 대해 알아보며 리펙토링한 결과가 마음에 들었습니다. 이번 문제로
StringBuilder
와 StringBuffer
에대 많은 지식을 알게 되었습니다.
- 간략한 문자열 연산은
String 클래스
로 문제에 접근하며, 연산 및 수정이 많을 경우 StringBuilder
를 사용하여 처리하는 방법이 좋은 것 같습니다.
- 다른 사람의 코드를 확인하며 자바 메소드를 활용하여 간결하고 가독성이 좋은 코드를 알게 되었습니다. 간략한 문제지만 배워가는 내용이 많이 뿌듯합니다.
6. 참고