🗃️javascript/코테 프레임 문제

1-9 A를 # 으로(24년)[배열은 참조타입, 문자열은 원시타입]

하얀성 2023. 9. 19. 07:08

<제출답안>

문제는 없는 코드다. 하지만 gpt가 리팩토링하니 더 간단하게 만들수 있다.

바로. includes는 필요가 없다는것. 그저 바꾸기만 하면됨.

function solution(s){
  if(s.includes('A')) return s.replaceAll('A','#')
}
let str="BANANA";
console.log(solution(str));

 

더 간결해진 모습

function solution(s){
  return s.replaceAll('A','#')
}
let str="BANANA";
console.log(solution(str));

<다른 답> 문자열 합치기는 +로 된다는것. (이게 잘 적응이 안되서 다른 문제 풀 때 애먹음)

function solution(s){
  let answer = '';
  for(let x of s){
    if(x==='A'){
      answer += '#';
  }else{
    answer += x;
  }
}
return answer;
}
let str="BANANA";
console.log(solution(str));

(추가내용)

배열은 변경하게 되면 주소를 참조하게 되어 참조하는 변수의 배열도 같이 바뀌지만

문자열은 다른 변수가 참조하는 상황에서 문자열이 바뀌더라도 참조하고 있는 변수는 바뀌지 않음. 


배열 (참조 타입)
JavaScript에서 배열은 객체의 형태로 취급되며, 변수에 할당될 때 메모리에 저장된 그 위치(참조)가 할당됩니다. 따라서 두 변수가 같은 배열을 참조하게 되면, 한 변수에서 배열을 수정하면 다른 변수에서도 그 변경이 보이게 됩니다.

let arr1 = [1, 2, 3];
let arr2 = arr1;

arr2[0] = 99;

console.log(arr1); // [99, 2, 3]
console.log(arr2); // [99, 2, 3]

위의 코드에서 arr2는 arr1과 동일한 배열을 참조하므로, arr2에서 배열을 수정하면 arr1에서도 그 변경이 반영됩니다.

 

문자열 (기본/원시 타입)
문자열은 원시 타입이므로, 문자열이 변수에 할당될 때 그 값 자체가 할당됩니다. 따라서 한 변수에서 문자열을 변경해도, 다른 변수에서는 그 변경이 반영되지 않습니다.

let str1 = "hello";
let str2 = str1;

str2 = "world";

console.log(str1); // "hello"
console.log(str2); // "world"

위의 코드에서 str2는 처음에 str1의 값을 가지지만, str2에서 문자열을 변경해도 str1의 값은 변경되지 않습니다.

이렇게 참조 타입과 원시 타입은 변수 할당과 관련하여 서로 다르게 동작합니다.

 


24.4.10 업데이트

틀린것도 없고, 리액트에서 자주쓰이는 모양이지만....

위의 replaceAll 방식이 훨씬 나아보이는건 사실이다.

function solution(str) {
  let answer;
  answer = [...str].map((x) => (x === "A" ? (x = "#") : x));
  return answer.join("");
}
let str = "BANANA";
console.log(solution(str));