코딩테스트/프로그래머스

[코딩테스트 입문] Day 18 문자열 안에 문자열 (JavaScript)

Kim Minki 2023. 2. 8. 15:48

문자열안에 문자열

문제 설명

문자열 str1, str2가 매개변수로 주어집니다. str1 안에 str2가 있다면 1을 없다면 2를 return하도록 solution 함수를 완성해주세요.

제한사항

  • 1 ≤ str1의 길이 ≤ 100
  • 1 ≤ str2의 길이 ≤ 100
  • 문자열은 알파벳 대문자, 소문자, 숫자로 구성되어 있습니다.

입출력 예

str1 str2 result
"ab6CDE443fgh22iJKlmn1o" "6CD" 1
"ppprrrogrammers" "pppp" 2
"AbcAbcA" "AAA" 2

입출력 예 설명

입출력 예 #1

  • "ab6CDE443fgh22iJKlmn1o" str1str2가 존재하므로 1을 return합니다.

입출력 예 #2

  • "ppprrrogrammers" str1str2가 없으므로 2를 return합니다.

입출력 예 #3

  • "AbcAbcA" str1str2가 없으므로 2를 return합니다.

나의 풀이

function solution(str1, str2) {
    let answer;
    const str2Reg = new RegExp(str2, 'g');
    if(str1.match(str2Reg)){
        answer = 1;
    }
    else answer = 2;
    return answer;
}
  • str2를 전역 탐색 플래그인 g와 함께 정규표현식 객체로 만들어 str2Reg에 저장하고, 이를 match()메서드를 이용하여, str1str2가 있는지 확인하는 방법
    • 문자열이 변수에 저장되어 있기 때문에 new RegExp를 사용하여 정규표현식 객체로 만들 수 밖에 없었다.
    • 이제 와서 보니 이 문제에서는 str2str1안에 있는지, 없느지 여부만 판단하면 되기 때문에 전역 탐색 플래그인 g는 사용할 필요가 없는 것 같다.
  • 하지만 이처럼 단순히 하나의 문자열이 다른 문자열 안에 있는지 없는지만 판별할 때에는 굳이 정규표현식을 사용하지 않아도 되었다.

나중에 알게된 방법

includes()

function solution(str1, str2) {
    const answer = str1.includes(str2) ? 1:2;
    return answer;
}
  • includes()메서드는 하나의 문자열이 다른 문자열에 포함되어 있는지를 판별하고, 그 결과를 true 또는 false로 반환한다.
  • 왜인지 모르겠는데 처음에 includes()메서드를 문자열이 아닌 문자 하나만 사용할 수 있는 줄 착각해 사용하지 않았다.
  • 문자열 안에 다른 문자열이 있는지 알고 싶은 경우 정규표현식을 사용하지 않고도 간단하게 판별할 수 있어 아주 유용할 것 같다.

match()

function solution(str1, str2) {
    const answer = str1.match(str2) ? 1:2;
    return answer;
}
  • match()메서드는 매개변수로 정규표현식을 받아 문자열을 일치시킨 결과를 검색하고, 그 결과를 Array 또는 null로 반환한다.
  • 이번에 알게 되었는데 매개변수로 정규표현식이 아닌 문자열이나 숫자가 오는 경우 내부적으로 정규표현식으로 변환되어 사용된다고 한다.
  • 그래서 위의 식처럼 사용해도 문제가 없는 것.
  • 조건 판별은 Array가 반환되면 Truthy, null이 반환되면 Falsy
  • 단순히 검색만 하고 싶은 경우에는 편하게 문자열이나 숫자를 매개변수로 바로 사용하고, 정규표현식의 플래그를 통해 여러 조건을 주고 싶은 경우에는 문자열이나 숫자를 정규표현식 객체로 직접 변환해 사용하면 될 것 같다.