문자 "A"와 "B"로 이루어진 문자열 myString과 pat가 주어집니다. myString의 "A"를 "B"로, "B"를 "A"로 바꾼 문자열의 연속하는 부분 문자열 중 pat이 있으면 1을 아니면 0을 return 하는 solution 함수를 완성하세요.
1 ≤ myString의 길이 ≤ 100
1 ≤ pat의 길이 ≤ 10
myString과 pat는 문자 "A"와 "B"로만 이루어진 문자열입니다.
myString | pat | result |
---|---|---|
"ABBAA" | "AABB" | 1 |
"ABAB" | "ABAB" | 0 |
입출력 예 설명
입출력 예 #1
"ABBAA"에서 "A"와 "B"를 서로 바꾸면 "BAABB"입니다. 여기에는 부분문자열 "AABB"가 있기 때문에 1을 return 합니다.
입출력 예 #2"ABAB"에서 "A"와 "B"를 서로 바꾸면 "BABA"입니다. 여기에는 부분문자열 "BABA"가 없기 때문에 0을 return 합니다.
function solution(myString, pat) {
let str = '';
for(let i in myString){
if(myString[i] === 'A'){
str += 'B'
}
if(myString[i] === 'B'){
str += 'A'
}
}
return str.includes(pat) ? 1 : 0
}
제일 기본적인 방법인 for문을 사용해 A
는 B
로, B
는 A
로 변경했다.
function solution(myString, pat) {
let str = '';
for(let i in myString){
str += (myString[i] === 'A' ? 'B' : 'A')
}
return str.includes(pat) ? 1 : 0
}
리팩토링을 진행해 좀 더 간결하게 작성했다.
삼항연산자는 if문과 달리 값이 될 수 있기에 조건이 충족 될 경우
str += 'B'
또는 str += 'A'
값으로 반환한다.
const solution = (myString, pat) => [...myString].map(v => v === 'A' ? 'B' : 'A').join('').includes(pat) ? 1 : 0
function solution(myString, pat) {
const newPat = [...pat].reduce((acc, cur) => {
if (cur === 'A') {
acc += 'B';
} else {
acc += 'A';
}
return acc;
}, '');
return myString.includes(newPat) ? 1 : 0;
}
spread 문법으로 배열을 만들고 map, reduce 메서드를 사용해 코드를 작성하셨다.
나도 초반에는 배열로 작성해 볼까 했지만,
for문으로도 충분히 깔끔한 코드를 작성할 수 있다 생각해 변경하지 않았다.
여러 관점으로 코드를 확인하니 확실히
생각 하는게 넓어지는 것 같다.
좀 더 자주 문제를 풀어봐야겠다.