[ 프로그래머스 Lv.0 | Java ] 문자열 겹쳐쓰기 📌

dokim·2023년 8월 27일
0
post-thumbnail

🏷️문자열 겹쳐쓰기


1. 해결 전략

  • for 루프를 통해 my_string 길이만큼 i를 증가시키며 반복
    1. 문자열 my_string 데이터를 s길이까지 복사합니다.
    2. my_strings길이만큼 복사 후 overwrite_string 문자열을 복사합니다. 이때 현재까지 복사한 문자열 길이가 문자열 my_string의 길이를 초과하면 안되므로 i를 증가시켜 나중에 확인해 줍니다.
    3. 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 = "";
        
        // my_string 길이만큼 i를 증가, 반복
        for(int i = 0; i < my_string.length(); i++){
            
            // 2. overwrite_string 복사
            if(i == s){
                for(int k = 0; k < overwrite_string.length(); k++){
                    answer += overwrite_string.charAt(k);
                    i++;
                }
            }
            
            // 1. s의 길이까지만 my_string를 복사
            // 3. overwrite_string 복사 후 남은 my_string 길이만큼 복사
            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 사용
        StringBuilder answer = new StringBuilder();

        for (int i = 0; i < my_string.length(); i++) {
        	// 반복문으로 복사가 아닌 .append롤 사용하여 복사
            if (i == s) {
                answer.append(overwrite_string);
                i += overwrite_string.length() - 1;
            } else {
                answer.append(my_string.charAt(i));
            }
        }

		// String으로 형변환하여 반환
        return answer.toString();
    }
}
  • 가변하는 문자열을 위해 StringBuilder를 사용하여 효율적으로 문자열을 가공합니다.
  • if (i == s)일 때 overwrite_string을 한 번에 append하여 추가합니다. 그리고 ioverwrite_string 길이만큼 증가하여 줍니다.
  • else 블록에서는 my_string 문자를 그대로 append합니다.

[ String ]

  • String 클래스의 인스턴스는 불변(immutable)이기 때문에 수정할 때마다 기존 메모리에 복사되는 것이 아닙니다.
  • 문자열을 수정하면 실제로는 새로운 String 생성되고 이전 문자열은 가비지 컬렉터로 들어갑니다. 이로 인해 수정 작업이 필요한 경우 메모리에 새로운 문자열을 할당하는 것은 피할 수 없습니다.

[ StringBuilder ]

  • StringBuilder 클래스가변성(mutable)을 가지며 내부적으로 버퍼를 사용하여 문자열을 조작합니다.
  • 문자열 수정 작업이 필요한 경우 StringBuilder는 기존 버퍼를 재사용하며 필요한 수정 작업을 String 클래스 보다 더 효율적으로 수행할 수 있습니다.
  • 이로 인해 문자열 수정 작업이 많은 상황에서 StringBuilder를 사용하면 메모리 할당과 복사 작업을 효율적으로 관리할 수 있습니다.

[ StringBuilder ] vs [ StringBuffer ]

  • StringBufferStringBuilder는 둘 다 가변 문자열을 다루는 클래스로, 문자열 수정 작업을 수행할 수 있습니다.
  • 멀티스레드 환경에서 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. 후기 및 반성

  • 처음 날것의 코드로 문제를 해결할 수 있었지만 문자열 수정에 대해 알아보며 리펙토링한 결과가 마음에 들었습니다. 이번 문제로 StringBuilderStringBuffer에대 많은 지식을 알게 되었습니다.
  • 간략한 문자열 연산은 String 클래스로 문제에 접근하며, 연산 및 수정이 많을 경우 StringBuilder를 사용하여 처리하는 방법이 좋은 것 같습니다.
  • 다른 사람의 코드를 확인하며 자바 메소드를 활용하여 간결하고 가독성이 좋은 코드를 알게 되었습니다. 간략한 문제지만 배워가는 내용이 많이 뿌듯합니다.

6. 참고

0개의 댓글