JavaScript 알고리즘 - 문자열 탐색

이혜란·2022년 11월 7일

알고리즘

목록 보기
1/5
post-thumbnail

🔐 문자 찾기

s 문자열에 search 에 해당하는 문자가 몇개 있는지 확인하여 그 개수를 반환하는 프로그램을 작성하세요.

문자열 s = "COMPUTERPROGRAMMING"
매개변수 search = R

<제한 사항>

  • 문자열 s의 길이는 100을 넘지 않습니다.
  • 문자열 s는 대문자로만 이루어져 있습니다.

// s = "COMPUTERPROGRAMMING" 
function solution(s) {
  let answer = 0;
  let search = 'R';
  for(let i = 0; i < s.length; i++) {
    if(s[i] === search) {
      answer++
    }
  }
  return answer
}

console.log(solution("COMPUTERPROGRAMMING")) // 3 이 출력됩니다.

또는 아래와 같이 작성해 줄 수 있습니다.

문자열 s = "IT IS TIME TO GO"
매개변수 search = T

// s = "IT IS TIME TO GO"
function solution(s) {
  let answer = 0;
  let search = 'T';
  for (let i = 0; i < s.length; i++) {
    if (s[i] !== search) continue;
    answer++
  }
  return answer
}
console.log(solution0("IT IS TIME TO GO")) // 3 이 출력됩니다.

🔐 대문자 찾기

s 문자열에 알파벳 대문자가 몇 개 있는지 알아내어 개수를 반환하는 프로그램을 작성하세요.

문자열 s = "KoreaTimeGood"

우선 아래와 같이 문제를 풀기 위해서 영어 대문자의 아스키번호를 알아 두어야 합니다.

영어 대문자 아스키번호 : 65~90
영어 소문자 아스키번호 : 97~122
문자 '0'~'9' 아스키번호 : 48~57

// .charCodeAt() = 문자의 아스키번호를 반환해주는 빌트인 함수
function solution(s) {
  let answer = 0;
  for(let i = 0; i < s.length; i++) {
    if(s.charCodeAt(i) >= 65 && s.charCodeAt(i) <= 90) {
      answer++
    }
  }
  return answer
}

console.log(solution("KoreaTimeGood")) // 3 이 출력됩니다.

또는 아래와 같이 for of 문을 사용하여 표현해 줄 수 있습니다.

function solution(s) {
  let answer = 0;
  for(let x of s) {
    if(x.charCodeAt() >= 65 && x.charCodeAt() <= 90) {
      answer++
    }
  }
 return answer 
}

console.log(solution("KoreaTimeGood")) // 3 이 출력됩니다.

일치 연산자(===)와 .toUpperCase() 함수를 사용해서 표현해 줄수도 있습니다.

function solution(s) {
  let answer = 0;
  for(let x of s) {
    if(x === x.toUpperCase()) answer++;
  }
  return answer;
}

console.log(solution("KoreaTimeSoGood")) // 4 가 출력됩니다.

🔐 대소문자 변환

대문자와 소문자가 같이 존재하는 s 문자열의 대문자는 소문자로, 소문자는 대문자로 변환하여 반환하는 프로그램을 작성하세요.

문자열 s = "StuDY"

이때 문자열을 대문자로 바꿔주는 .toUpperCase() 함수와 소문자로 바꿔주는 .toLowerCase() 함수를 알아두어야 합니다.

// if 문 안에는 대문자인지 아스키번호로 확인하는 조건문이 있습니다.
function solution(s) {
  let answer = "";
  for(let i = 0; i < s.length; i++) {
    if(s.charCodeAt(i) >= 65 && s.charCodeAt(i) <= 90) {
      answer += s[i].toLowerCase() // 참일 때 대문자를 소문자로 변환
    } else {
      answer += s[i].toUpperCase() // 거짓일 때 소문자를 대문자로 변환
    }
  }
  return answer
}

console.log(solution("StuDY")) // "sTUdy" 가 출력됩니다.

또는 for of 문을 사용하여 더욱 간단하게 표현해 줄 수 있습니다.

function solution(s) {
  let answer = "";
  for(let x of s) {
    if(x === x.toUpperCase()) {
      answer += x.toLowerCase()
    } else {
      answer += x.toUpperCase()
    }
  }
  return answer
}

console.log(solution("StuDY")) // "sTUdy" 가 출력됩니다.

🔐 가장 긴 문자열 찾기

문자열 s에 N개의 문자열이 입력되면 그 중 가장 긴 문자열을 찾아 반환하는 프로그램을 작성하세요.
답이 여러개일 경우 s 문자열 배열에서 제일 먼저 나타나는 문자ß열을 답으로 합니다.

문자열 s = ['teacher', 'time', 'student', 'beautiful', 'good']

function solution(s) {
  let answer = "";
  let maxL = 0;
  for (let i = 0; i < s.length; i++) {
    if (s[i].length > maxL) {
     maxL = s[i].length
     answer = s[i]
    }
  }
  return answer
}


console.log(solution(['teacher', 'time', 'student', 'beautiful', 'good']))
// beautiful 이 출력됩니다.

같은 내용이지만 for of 문으로도 작성이 가능합니다.

function solution(s) {
  let answer = '';
  let maxL = 0;
  for(let x of s) {
    if(x.length > maxL) {
      maxL = x.length;
      answer = x;
    }
  }
  return answer
}

console.log(solution(['teacher', 'time', 'student', 'beautiful', 'good']))
// beautiful 이 출력됩니다.

🔐 중복 문자 제거

문자열 s에 소문자로 된 문자열이 입력되면 중복된 문자는 제거하고 모든 문자는 오직 하나만 있게 하여 반환하는 프로그램을 작성하세요.
제거된 문자열의 각 문자는 원래 문자열의 순서를 유지합니다.

문자열 s = "ksekkset"

해당 문제는 .indexOf() 함수를 알아두면 해결할 수 있습니다.

function solution(s) {
  let answer = '';
  for (let i = 0; i < s.length; i++) {
    if (s.indexOf(s[i]) === i) {
      answer += s[i]
    }
  }
  return answer
}


console.log(solution('ksekkset')) // kset 가 출력됩니다.

🔐 공통 문자열 찾기

s 문자열에 N개의 문자열이 주어지면 이 문자열들의 최대 공통 접두사를 반환하는 프로그램을 작성하세요.

만약 문자열들이 ["long", "longtime", "longest"] 라면 세 단어의 최대 공통 접두사는 "long"입니다.

이때 Set 객체를 사용하여 문제를 풀어줄 수 있습니다. Set 객체의 특징은 중복 값을 허용하지 않는다는 점 입니다.

문자열 s = ["long", "longtime", "longest"]

function solution(s) {
  let answer = '';
  for (let i = 0; i < s[0].length; i++) {
  	let set = new Set();
    for (let x of s) {
     set.add(x[i])
    }
   if(set.size === 1) {
    answer += s[0][i]
   }
  }
 return answer 
}

console.log(solution(["long", "longtime", "longest"])) // long 이 출력됩니다.

🔐 문자열 압축

알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는 문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하려고 합니다.

매개변수 s에 문자열이 입력되면 반복횟수를 표기하는 방법으로 문자열을 압축하여 반환하는 프로그램을 작성하세요.

단 반복횟수가 1인 경우 생략합니다.

문자열 s = "KKHSSSSSSSE"

function solution(s) {
  let answer = '';
  let cnt = 1;
  for (let i = 0; i < s.length; i++) {
    if(s[i] === s[i+1]) {
      cnt++
    } else {
      cnt === 1 ? answer += s[i] : answer += s[i] + cnt;
      cnt = 1;
    }
  }
  return answer;
}

console.log(solution('KKHSSSSSSSE'));  // K2HS7E 가 출력됩니다.

🔐 회문 문자열

앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 회문 문자열이라고 합니다.
매개변수 s에 문자열이 입력되면 해당 문자열이 회문 문자열이면 "YES", 회문 문자열이 아니면 “NO"를 출력하는 프로그램을 작성하세요.

단 회문을 검사할 때 대소문자를 구분하지 않습니다.

입출력 예: s = gooG / result = YES

아래와 같이 세가지 방법으로 다르게 작성할 수 있습니다.

function solution(s) {
  let answer = 'YES';
  s = s.toLowerCase();
  for (let i = 0; i < Math.floor(s.length / 2); i++) {
    if (s[i] !== s[s.length - i - 1]) return 'NO'
  }
  return answer;
}

console.log(solution('gooG')); // YES 가 출렵됩니다.
function solution(s) {
  let answer = 'YES';
  s = s.toLowerCase();
  let lt = 0, rt = s.length - 1;
  while (lt < rt) {
    if (s[lt] !== s[rt]) return 'NO';
  }
  return answer;
}

console.log(solution('gooG')); // YES 가 출렵됩니다.
function solution(s) {
  let answer = 'YES';
  s = s.toLowerCase();
  if(s.split('').reverse().join('') !== s) return 'NO';
  return answer;
}

console.log(solution('gooG')) // YES 가 출렵됩니다.

🔐 회문 문자열2

문자열 s가 주어지면 s가 최대 문자 1개까지 지워서 회문문자열이 되면 “YES"를 출력하고, 그렇지 않으면 ”NO"를 출력하는 프로그램을 작성하세요.

예를 들어 abcbdcba에서 4번째 문자인 b를 제거하면 abcdcba로 회문이 됩니다. 또는 5번째 문자인 d를 제거하면 abcbcba로 회문이 됩니다.

문자열 s = "abcbdcba"

function solution(s) {
  let answer = '';
  let sArr = s.split('');
  
  if (s === s.split('').reverse().join('');) {
    answer = 'YES' 
  } else {
    for (let i = 0; i < sArr.length; i++) {
      sArr.slice(i, 1)
      if(sArr === backArr

console.log(solution('abcbdcba'));

0개의 댓글