[프로그래머스 JavaScript] 공백으로 구분하기2(feat.정규표현식, .trim(), .split())

옹잉·2023년 10월 23일

문제

막혔던 점

const solution = (my_string) => {
    let answer = [];
    let str = my_string.split(" ");
    for (let i = 0; i < str.length; i++) {
        answer[i] = str[i];
    }
    return answer;
   
}

처음에 이렇게 식을 썼는데

입력값 〉 " i love you"
기댓값 〉 ["i", "love", "you"]
실행 결과 〉 실행한 결괏값 ["","i","","","","love","","you"]

입력값 〉 " programmers "
기댓값 〉 ["programmers"]
실행 결과 〉 실행한 결괏값 ["","","","","programmers","",""]

이런 결과가 나왔다.
왜그럴까 생각해보니 .split(' ') 메소드가 공백 한 개를 기준으로 문자열을 분리하기 때문에 연속된 공백이 있는 경우 각 공백 사이에 빈 문자열('')을 반환하는 것이었다.
이를 해결하기 위해서 공백 한 개 이상을 기준으로 문자열을 분리하는 정규표현식을 사용해야 한다.

  • \s+ : 공백 문자(스페이스, 탭, 줄 바꿈 등)가 한 번 이상 반복되는 패턴을 의미하는 정규 표현식

정규표현식 써준 뒤에 배열의 시작과 끝에 또 공백이 있어 .trim() 메소드를 사용했다.

풀이

const solution = (my_string) => {
    let answer = [];
    let str = my_string.trim().split(/\s+/);
    for (let i = 0; i < str.length; i++) {
        answer[i] = str[i];
    }
    return answer;
  
}

다른 풀이 중 trim, 정규표현식을 쓰지 않은 풀이가 있어 다시 시도해봤다.

const solution = (my_string) => {
    let answer = []
    let arr = my_string.split(" ");
    for (let i = 0; i < arr.length; i++) {
        if(arr[i] !== "") { // 공백이 아닌 경우에 배열 answer에 담기
            answer.push(arr[i]);
        }
    }
    return answer
}

궁금한 점

Q1. 왜 처음에 .split(/\s+/)로 정규표현식 썼을 때 문자열 양 끝에 있는 공백은 제거하지 못했을까?
A. .split() 메서드는 구분자를 기준으로 분리하는 역할이다. 그 과정에서 구분자가 제거되는것이 아닌 "구분자를 기준으로 문자열을 분리하고 그 구분자들은 결과 배열에 포함되지 않는다" 라고 보는것이 맞다.

그럼 왜 문자열 시작과 끝의 공백은 사라지지 않았을까?

원래 문자열에서 시작과 끝의 '공백' 다음에 오는 내용이 없으므로, 그 자리에는 빈 문자열('')이 들어간 것이다. 이를 방지하기 위해 .trim()으로 먼저 처리해준 후 .split()을 사용했다.

정규표현식 정리 (클릭)

profile
틀리더라도 🌸🌈🌷예쁘게 지적해주세요💕❣️

0개의 댓글