🗃️javascript/프로그래머스

인덱스 바꾸기(Lv.0)[인덱스](배열1을 바꿀 때, 값은 같은 배열2를 선언)

하얀성 2023. 1. 5. 17:24
  •  
문제 설명

문자열 my_string과 정수 num1, num2가 매개변수로 주어질 때, my_string에서 인덱스 num1과 인덱스 num2에 해당하는 문자를 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.


제한사항
  • 1 < my_string의 길이 < 100
  • 0 ≤ num1, num2 < my_string의 길이
  • my_string은 소문자로 이루어져 있습니다.
  • num1  num2

입출력 예my_stringnum1num2result
"hello" 1 2 "hlelo"
"I love you" 3 6 "I l veoyou"

입출력 예 설명

입출력 예 #1

  • "hello"의 1번째 인덱스인 "e"와 2번째 인덱스인 "l"을 바꾸면 "hlelo"입니다.

입출력 예 #2

  • "I love you"의 3번째 인덱스 "o"와 " "(공백)을 바꾸면 "I l veoyou"입니다.

<제출 답안>

 

function solution(my_string, num1, num2) {
    
    let z = my_string[num1]
    my_string[num1] = my_string[num2]
    my_string[num2] = z
    
    return my_string
}

 

첫 접근은 3개의 변수 선언을 통한 두개의 변수 값 이동으로 할려고 햇는데 잘 안됨.

 

아래 처럼 새로운 배열을 선언해준 뒤에 문자열을 쪼개야 배열 적용이 가능한 것이었다... 문자열도 배열이지만... []을 쓸려면 split나 ...str을 사용해서 각각의 배열로 만들어 줬어야 하는 것이다. 

function solution(my_string, num1, num2) {
    var new_string = my_string.split('');
    var temp_string = my_string[num2];
    new_string[num2] = new_string[num1];
    new_string[num1] = temp_string;
    return new_string.join('');
}

function solution(my_string, num1, num2) {
    
    let z = my_string[num1];
    let y = my_string[num2]; 
    
    return my_string.replace(my_string[num2], z).replace(my_string[num1], y)
    
}

 

"hello", 1, 2
기댓값 "hlelo"
실행 결과 테스트를 통과하였습니다.
테스트 2
입력값 "I love you", 3, 6
기댓값 "I l veoyou"
실행 결과 실행한 결괏값 "I love you"이 기댓값 "I l veoyou"과 다릅니다.

 

안된다..ㅎㅎ;  ㅡㅡ> 두번째에서 안먹힌다. 왜지?

 

function solution(my_string, num1, num2) {
    
    const z = my_string.slice(num1, num1 +1);
    
   return my_string.replace(my_string[num1], my_string[num2]).replace(my_string[num2], z)
    
}

ㅡㅡ> 아마 replace().repalce()이런식으로 연속적용이 안되는 듯싶다. 이유는 모르겠다.


결국 답을 못 찾겠다. 

slice와 splice에 대해 잘 못 이해하고 있었다.

 

-slice(자르고 싶은 곳 시작index, 자르고 싶은 곳 끝지점+1)
-splice(자르고 싶은 곳 시작index, 삭제할 갯수, 대체할 내용)

 

slice는 그저. 자른 것들만을 모아 만든 배열을 출력 (slice로 편집당한 기존 배열의 '요소'들을 출력)

splice는 아예 기존 배열의 요소를 바꾸거나, 빈 공간으로 만들어서 출력(splice로 편집된 상태의 '기존 배열'을 출력)

 

그리고 얘네들 문자열에서 안써짐...ㅎㅎ;

 

 

<마지막 수정 결과>

function solution(my_string, num1, num2) {
    let result = [...my_string]
    
    result.splice(num1, 1, my_string[num2])
    result.splice(num2, 1, my_string[num1])
    return result.join("")
    
}

 

이런식으로 새 배열인 result를 변경시키고, 값을 my_string에서 데려옴으로써 값들의 연쇄 변동이 발생되지 않음.

 


<보충>

 

구문

    array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
Copy to Clipboard

매개변수

start

배열의 변경을 시작할 인덱스입니다. 배열의 길이보다 큰 값이라면 실제 시작 인덱스는 배열의 길이로 설정됩니다. 음수인 경우 배열의 끝에서부터 요소를 세어나갑니다(원점 -1, 즉 -n이면 요소 끝의 n번째 요소를 가리키며 array.length - n번째 인덱스와 같음). 값의 절대값이 배열의 길이 보다 큰 경우 0으로 설정됩니다.

deleteCount Optional

배열에서 제거할 요소의 수입니다. deleteCount를 생략하거나 값이 array.length - start보다 크면 start부터의 모든 요소를 제거합니다. deleteCount가 0 이하라면 어떤 요소도 제거하지 않습니다. 이 때는 최소한 하나의 새로운 요소를 지정해야 합니다.

item1, item2, <em>...</em> Optional

배열에 추가할 요소입니다. 아무 요소도 지정하지 않으면 splice()는 요소를 제거하기만 합니다.