본문 바로가기

프로그래밍/코딩테스트

[코딩테스트] 프로그래머스 - 문자열 겹쳐쓰기

문자열 겹쳐쓰기

문제 설명

문자열 my_string, overwrite_string과 정수 s가 주어집니다. 문자열 my_string의 인덱스 s부터 overwrite_string의 길이만큼을 문자열 overwrite_string으로 바꾼 문자열을 return 하는 solution 함수를 작성해 주세요.


제한사항

  • my_string와 overwrite_string은 숫자와 알파벳으로 이루어져 있습니다.
  • 1 ≤ overwrite_string의 길이 ≤ my_string의 길이 ≤ 1,000
  • 0 ≤ s ≤ my_string의 길이 - overwrite_string의 길이

입출력 예

my_string  overwrite_string  s result
"He11oWor1d" "lloWorl" 2 "HelloWorld"
"Program29b8UYP" "merS123" 7 "ProgrammerS123"

 


입출력 예 설명

입출력 예 #1

  • 예제 1번의 my_string에서 인덱스 2부터 overwrite_string의 길이만큼에 해당하는 부분은 "11oWor1"이고 이를 "lloWorl"로 바꾼 "HelloWorld"를 return 합니다.

입출력 예 #2

  • 예제 2번의 my_string에서 인덱스 7부터 overwrite_string의 길이만큼에 해당하는 부분은 "29b8UYP"이고 이를 "merS123"로 바꾼 "ProgrammerS123"를 return 합니다.

설계 

  1. i = 0부터 my_string 길이까지 반복
  2. 만약 s 길이와 i가 같으면 my_string을 s 길이만큼 앞을 자름 → substring() 메서드
  3. 자른 my_string에 overwrite_string을 이어붙임 → concat() 메서드
    3-1. 디버깅) 첫번째 입출력 예1 HelloWorld에서 'd'가 출력되지 않음 → split 후 길이가 누락됨을 확인
                         두번째 입출력 예2는 통과
  4. overwrite_string의 길이와 s길이를 합하여 substring 후 이어붙임 → substring() 메서드, concat() 메서드
    4-1. 2시간동안 생각하여 겨우 풀었음;;ㅠ

코드

class Solution {
    public String solution(String my_string, String overwrite_string, int s) {
        
        String answer = "";
        
        if((overwrite_string.length() >= 1 && overwrite_string.length() <= 1000) && (my_string.length() >= 1 && my_string.length() <= 1000)){
            // my_string을 s만큼 split
            String spltStr = my_string.substring(0, s);     
            // overwrite_string으로 concat
            String cnctStr = spltStr.concat(overwrite_string);

            // my_string의 남은 문자열
            String leftStr = my_string.substring(s + overwrite_string.length());
            answer = cnctStr.concat(leftStr);
        }
        
        return answer;
    }
}

 

 

리팩토링 후 코드 

class Solution {
    public String solution(String my_string, String overwrite_string, int s) {
        
        String answer = "";
        
    	if((overwrite_string.length() >= 1 && overwrite_string.length() <= 1000) && (my_string.length() >= 1 && my_string.length() <= 1000)){
            answer = my_string.substring(0, s) // my_string을 s만큼 split
                            .concat(overwrite_string) // // overwrite_string으로 concat
                            .concat(my_string.substring(s + overwrite_string.length())); // my_string의 남은 문자열 concat
        }
        
        return answer;
        
    }
}