코딩테스트/프로그래머스
                
              [코딩테스트 입문] 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" 
str1에str2가 존재하므로 1을 return합니다. 
입출력 예 #2
- "ppprrrogrammers" 
str1에str2가 없으므로 2를 return합니다. 
입출력 예 #3
- "AbcAbcA" 
str1에str2가 없으므로 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()메서드를 이용하여,str1에str2가 있는지 확인하는 방법- 문자열이 변수에 저장되어 있기 때문에 
new RegExp를 사용하여 정규표현식 객체로 만들 수 밖에 없었다. - 이제 와서 보니 이 문제에서는 
str2가str1안에 있는지, 없느지 여부만 판단하면 되기 때문에 전역 탐색 플래그인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 - 단순히 검색만 하고 싶은 경우에는 편하게 문자열이나 숫자를 매개변수로 바로 사용하고, 정규표현식의 플래그를 통해 여러 조건을 주고 싶은 경우에는 문자열이나 숫자를 정규표현식 객체로 직접 변환해 사용하면 될 것 같다.