JavaScript/알고리즘

프로그래머스 문자열 바꿔서 찾기 JS ( 값의 대치를 위해 map()사용하기 )

hihiha2 2023. 6. 12. 21:11
반응형

문제 설명 

문자 "A"와 "B"로 이루어진 문자열 myString과 pat가 주어집니다. myString의 "A"를 "B"로, "B"를 "A"로 바꾼 문자열의 연속하는 부분 문자열 중 pat이 있으면 1을 아니면 0을 return 하는 solution 함수를 완성하세요.

 

 

✅ 내 코드

function solution(myString, pat) {
  return myString
    .split("")
    .map((a) => (a === "A" ? "B" : "A"))
    .join("")
    .includes(pat)
    ? 1
    : 0;
}

이 문제는 A ➡️ B 로, B ➡️ A로 바꿀때 어떻게해야 A로 바뀐 B가 다시 A가 되지 않으면서 새로운 값으로 대치할 수 있는지가 핵심인것 같다.

처음에는 replace()를 생각했지만 replace()는 위와 같은 문제를 해결하기가 어려웠다. 그래서 요소하나하나를 검사한 뒤, 일일이 처리를 해주어야겠다고 생각했다.

 

일일이 요소를 돌면서 특정한 수행을 해야하기 때문에 map()사용하려고 했다. 그런데 위의 myString은 문자열이기때문에 Array에는 쓸수있는 map()을 바로 사용할 수 없다. 그래서 myString을 배열로 바꾸기 위해서 split('')을 사용했다. 이렇게하면 ['A', 'A', 'B', 'B']와 같이 값이 나뉘어진 배열로 바뀐다.

 

그런 다음 map을 통해서 값을 일일이 돌면서 '만약 A라면 B로 바꾸고, 그렇지 않다면(값이 B라면) A로 바꿔라'를 수행하도록 하였다.

문자열이 A와 B 2개만 있기 때문에 그렇지 않다면을 통해서 값이 B라면을 대신할 수 있다.

그러고 나면 값이 아래와 같이 각가 A와 B가 반대로 된 값이 나온다.

배열안에서 문자열이 다 나뉘어있기 때문에 이것들을 다시 붙이기 위해서 join()을 사용한다.

 

그런 다음, includes()을 통해서 값이 pat을 포함하고 있는지를 검사한다.

삼항연산자를 통해 만약 true라면 1을 false라면 0을 리턴하도록 한다.

 

 

 

 

💻  다른사람 코드중에 배울 것

function solution(myString, pat) {
    return myString.includes(pat.replaceAll('A','C').replaceAll('B','A').replaceAll('C','B'))?1:0
}

A와 B만을 사용해서 발생하는 문제를 C를 하나 더 추가하여서 해결한 방법이라 기발하다고 생각했다.

내가 기존에 쓰려고 생각했던것처럼 replaceAll()을 이용한 것은 같지만 repalceAll()을 쓰면  A ➡️ B 로, B ➡️ A로 바꿀때 A로 바뀐 B가 다시 A가 되는 문제가 발생한다. 

그래서 C라는 문자열을 하나 더 추가하여 이 문제를 해결하였다. 

AABB를 예시로 생각해보면 ➡️ CCBB ➡️ CCAA ➡️ BBAA로 바뀐다.

변환이 한단계가 더 추가되지만 이미 변환된 A➡️B 또는 B➡️A가 되는 문제가 해결된다.

 

 

 

 

🙋‍♀️ 내생각

replace()와 replacAll()은 자주 사용하기도하고 매우 유용한 메서드이지만, 순차적으로 값을 대치한다는 점에서 편하게 사용하기 어려운 경우가 있는것 같다.

이번 문제가 딱 그런 경우를 어떻게 해결할 것인가를 묻는 문제인듯하다. 이런 문제를 해결하기 위해서는 여러가지 방법이 있지만 map을 이용해서 각각의 값을 일일이 변환시키는 방법을 이용해보았다. 값을 대치하는 것을 위해서 무조건 replace()를 떠올릴 필요는 없는것 같다.

반응형