문제 설명
문자열 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" |
문제 풀이
function solution(my_string, overwrite_string, s) {
let answer = "";
let first = my_string.slice(0, s);
let last = my_string.slice(s + overwrite_string.length);
if (s === 0) {
answer = overwrite_string + last;
} else if (s + overwrite_string.length < my_string.length) {
answer = first + overwrite_string + last;
} else answer = first + overwrite_string;
return answer;
}
처음에 인덱스인 s부터 overwrite_string의 길이만큼을 my_string에서 교체하도록 했는데 틀린 부분이 있었다.
replace를 사용해서 my_string에서 s부터 overwrite_string의 길이만큼을 찾아내서
my_string에서 추려낸 값을 overwrite_string과 교체했다.
my_string에 반복되는 글자가 있을 경우 replace는 문자열 자체를 검색하므로 s부터가 아니라 0번 인덱스부터 찾아서 교체를 하기 때문이였다.
예를 들어 aaaaaa 라는 값에서 3번 인덱스부터 bbb로 교체한다고 하면 4번째 a부터 b로 바뀌어야 하는데,
aaaaaa 에서 s번째 인덱스부터 bbb의 길이만큼 즉, 4번째 인덱스부터 3개를 구하면 aaa가 된다.
replace를 사용했을 때 문자열이 다 다르면, abcdef라면 원하는 값을 바꿀 수 있지만, aaaaaa면 aaa를 교체한다고 했을 때 0번 인덱스부터 교체하게 되어 틀린 답이 나온다.
그래서 replace를 사용하지 않고 직접 구간을 정해서 답을 구했다.
first에는 0~ s까지를 구한 값
중간에는 overwrite_string
last에는 s ~ overwrite_string의 길이로 구간을 정했다.
만약 s가 0이면 my_string의 처음부터 교체해야하므로 교체해야하는 overwrite_string에 뒷부분인 last를 붙인다.
다른 조건은 2가지로 구분한다.
만약 s와 교체할 overwrite_string의 길이보다 원래 문자열이 더 긴 경우
즉, abcdef중에 cd를 gh로 바꾼다고 하면 abghef가 되는데, 뒷부분을 더하지 않으면 abgh 에서 끝나기 때문에 뒷부분인 ef를 더해줘야 한다.
그래서 first + overwrite_string+ last를 더한다.
그리고 나머지의 경우에는 s와 교체할 overwrite_string의 길이가 원래 문자열과 동일할 경우인데,
abcdef에서 def를 qwe로 교체한다고 하면 abc에 qwe를 더하게 되므로 처음 부분과 뒷부분으로만 나뉘기 때문에
first + overwrite_string을 더한다.
'개발 > 코딩테스트' 카테고리의 다른 글
[CTF] segfault practice - Secret Login (0) | 2024.05.20 |
---|---|
[CTF | JavaScript] segfault practice - Pin Code Crack (0) | 2024.05.16 |
[프로그래머스 | javascript] 정사각형으로 만들기 (0) | 2023.10.11 |
[프로그래머스 | JavaScript] 그림 확대 (0) | 2023.09.18 |
[프로그래머스 | JavaScript] 코드 처리하기 (0) | 2023.09.12 |