Study/JS Algorithm Rocket
[JS] 문자열탐색 (회문, 팰린드롬, 추출, 최단거리, 압축)
이안92
2021. 5. 25. 13:24
반응형
회문문자열
<script>
// 홀수일때도 짝수일때도 동일함 Math.floor 소수점 내림
function solution(s){
let answer="YES";
s=s.toLowerCase();
// 첫번째 방법
let len=s.length;
for(let i=0; i<Math.floor(len/2); i++){
if(s[i]!==s[len-i-1]) return "NO";
}
// 두번째 방법
// .split('') 문자 한개씩 배열이 됨 ["g", "o", "o", "o", "g"]
// .reverse() 뒤집음
// .join('') string으로 다시 묶음
if(s.split('').reverse().join('')!=s) return "NO";
return answer;
}
let str="goooG";
console.log(solution(str));
</script>
팰린드롬
.split('') 문자 한개씩 배열이 됨 ["g", "o", "o", "d"]
.reverse() 뒤집음
.join('') string으로 다시 묶음 good
<script>
function solution(s){
let answer="YES";
// 문제에 알파벳 이외의 문자는 무시한다고 기재되어있었으므로
// .replace() 소문자 알파벳 아닌것들 찾아서 빈문자로 바꿈
s=s.toLowerCase().replace(/[^a-z]/g, '');
if(s.split('').reverse().join('')!==s) return "NO";
return answer;
}
// 앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 팰린드롬이라고 한다
let str="found7, time: study; Yduts; emit, 7Dnuof";
console.log(solution(str));
</script>
숫자만 추출
<script>
function solution(str){
let answer="";
// isNaN() 숫자면 거짓, 숫자가 아니면 참
for(let x of str){
if(!isNaN(x)) answer+=x; // !isNaN() 숫자면 참
}
return parseInt(answer); // 0208 -> 208
}
let str="g0en2T0s8eSoft";
console.log(solution(str));
</script>
가장 짧은 문자거리
<script>
function solution(s, t){
let answer=[];
let p=1000;
// 왼쪽에서 오른쪽으로 먼저 문자열 탐색
// [1001, 0, 1, 2, 3, 0, 1, 2, 3, 4, 0]
for(let x of s){
if(x===t){
p=0;
answer.push(p);
}
else{
p++;
answer.push(p);
}
}
// 오른쪽에서 왼쪽으로 문자열 탐색
p=1000;
for(let i=s.length-1; i>=0; i--){
if(s[i]===t) p=0;
else{
p++;
answer[i]=Math.min(answer[i], p);
// 기존 answer[i]값과 p값 중 작은 값을 넣음
}
}
return answer;
}
let str="teachermode";
console.log(solution(str, 'e')); // e와의 최단거리
</script>
문자열 압축
<script>
function solution(s){
let answer="";
let cnt=1;
s=s+" ";
for(let i=0; i<s.length-1; i++){
if(s[i]===s[i+1]) cnt++;
else{
answer+=s[i];
if(cnt>1) answer+=String(cnt);
cnt=1;
}
}
return answer;
}
let str="KKHSSSSSSSE"; // K2HS7E
console.log(solution(str));
</script>
반응형