본문 바로가기
알고리즘/Programmers

[TIL] 2023.05.30 Programmers_문자열 겹쳐쓰기

by heereal 2023. 5. 30.

문자열 겹쳐쓰기

문제 설명

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

 

 

입출력 예

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

 


나의 1차 풀이

function solution(my_string, overwrite_string, s) {
    let slice = my_string.slice(s, s + overwrite_string.length);
    return my_string.replace(slice, overwrite_string);
}

테스트 케이스 딱 하나만 통과를 못했는데 예상으로는 slice가 주어진 문자열에 두 개 이상 존재해서 replace 할 때 문제가 되는 거 같다. 그래서 풀이 방법을 아예 바꿔 보기로 했다.

 

 

나의 2차 풀이

function solution(my_string, overwrite_string, s) {
    return [...my_string].map((str, index) => index >= s && index <= (s + overwrite_string.length - 1) ? overwrite_string[index - s] : str).join("");
}

map 이용해서 다시 풀어봤는데 가독성이 너무 안 좋은 거 같아서 for문으로 수정했다.

 

 

나의 최종 풀이

function solution(my_string, overwrite_string, s) {
    let array = [];
    for (let i = 0; i <= my_string.length; i++) {
        if (i >= s && i <= (s + overwrite_string.length - 1)) array.push(overwrite_string[i - s]);
        else array.push(my_string[i]);
    }
    return array.join("");
}

for문을 이용해서 교체해야 하는 문자열의 index에서는 array에 overwrite_string을 push 하고, 그렇지 않은 경우에는 기존 my_string을 push해서 최종적으로 array를 join 하여 문자열로 출력하는 방법으로 풀었다.

 


다른 사람의 풀이 01

function solution(my_string, overwrite_string, s) {    
    return my_string.slice(0, s) + overwrite_string + my_string.slice(s + overwrite_string.length);
}

overwrite_string 앞뒤로 slice 한 my_string을 붙여주는 방법도 있었다. 이게 더 효율적인 풀이인 듯?

 

 

다른 사람의 풀이 02

function solution(my_string, overwrite_string, s) {
    let result = ''
    for (let i = 0; i < my_string.length; i += 1) {
        if (i < s || i >= s + overwrite_string.length) {
            result += my_string[i]
        } else {
            result += overwrite_string[i-s]
        }
    }
    return result;
}

생각해 보니까 굳이 array를 join 할 필요 없이 바로 문자열에 더해줘도 되는 거였다 ㅎㅎ

 

댓글