JavaScript 정리-3 String.match(), regex(정규표현식)

Kyoungchan Cho·2022년 12월 21일
1

JS

목록 보기
3/8
post-thumbnail

프로그래머스 풀며 정리(3)

문제 : 2018 KAKAO BLIND RECRUITMENT > [1차] 다트 게임
https://school.programmers.co.kr/learn/courses/30/lessons/17682

본인 풀이

  1. 다트를 던져서 보너스와 옵션으로 계산되지 않은 숫자들만 뽑기 위해 rawScores 배열을 만듬
  2. 숫자를 제외한 보너스와 옵션 스트링을 뽑아서 배열을 만듬
  3. 위 과정에서 split을 할 경우 빈 문자열 요소가 생겨 filter를 통해 ""요소를 제거
    1,2에서 생성한 배열의 length가 같고 인덱스끼리 상응하기 때문에 for 반복문을 돌려 로직에 맞게 rawScores의 점수들을 연산
  4. rawScores의 합계를 return
function solution(dartResult) {
    
    const rawScores = dartResult.split(/[S]|[D]|[T]|[*]|[#]/)
                                .filter(x => {return x != ""})
                                .map(x => Number(x))
    
    const calArray = dartResult.split(/[0-9]/).filter(x => {return x != ""})

    
    for(let i = 0; i<calArray.length; i++) {
        if(calArray[i].includes("S")) { 
            rawScores[i] = rawScores[i]
        }
        if(calArray[i].includes("D")) {
            rawScores[i] = rawScores[i] ** 2
        }
        if(calArray[i].includes("T")) {
            rawScores[i] = rawScores[i] ** 3
        }
        if(calArray[i].includes("*")) {
            rawScores[i] = rawScores[i] * 2
            rawScores[i-1] = rawScores[i-1] * 2
        }
        if(calArray[i].includes("#")) {
            rawScores[i] = rawScores[i] * -1
        }      
    }

    return rawScores.reduce((p,x) => p+x)
}

다른 사람 풀이

다른 사람의 답안을 구경하던 중 전체적인 로직은 비슷하지만 정규표현식과 string.match() 활용한 코드를 참고하려 한다. 연산되지 않은 숫자의 배열과 숫자를 제외한 보너스, 옵션의 문자열 배열을 뽑아서 내 풀이보다 가독성을 좋게 하고 반복문을 덜 돌게 했다. 이번 기회에 정규표현식과 함께 사용할 수 있는 메소드를 정리해보겠다.

function solution(dartResult) {
    let num = dartResult.match(/\d+/g)
    let str = dartResult.match(/\D+/g)

    let score = [0,0,0]
    for (let i = 0; i < word.length; i++) {
        if (word[i] === "S") score[i] += Number(num[i]) ** 1
        if (word[i] === "D") score[i] += Number(num[i]) ** 2
        if (word[i] === "T") score[i] += Number(num[i]) ** 3
        if (word[i].includes("*")) {
            score[i-1] *= 2
            score[i] *= 2
        }
        if (word[i].includes("#")) score[i] *= -1
    }
    return score.reduce((a,b) => a+b)
}

정규표현식

const re = /regexr/i

'/', '/'사이에 정규식 패턴을 넣고 마지막 'i'자리에 플래그를 넣어 옵션을 추가한다.

플래그
i : 대소문자를 구분하지 않고 검색
g : 문자열 내의 모든 패턴을 검색 (없을시 최초 검색 결과만 반환)

패턴
a-zA-Z 영어알파벳(-으로 범위 지정)
ㄱ-ㅎ가-힣 한글 문자(-으로 범위 지정)
0-9 숫자(-으로 범위 지정)
. 모든 문자열(숫자, 한글, 영어, 특수기호, 공백 모두) 단, 줄바꿈 X
\d 숫자
\D 숫자가 아닌 것
\w 밑줄 문자를 포함한 영숫자 문자에 대응,[A-Za-z0-9_] 와 동일
\W \w 가 아닌 것
\s space 공백
\S space 공백이 아닌 것
\특수기호 특수기호 * \^ \& ! \? ...등

메소드

str.match(regexp)
문자열이 정규식과 일치하면, 일치하는 전체 문자열을 첫번 째 요소로 포함하는 배열을 반환한 다음 괄호 안에 캡쳐된 결과가 나온다. 일치하는 값이 없으면 null이 반환된다.

var str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
var regexp = /[A-E]/gi;
var matches_array = str.match(regexp);

console.log(matches_array);
// ['A', 'B', 'C', 'D', 'E', 'a', 'b', 'c', 'd', 'e']

이외의 정규식과 string.split(regexp), string.replace(regexp), regexp.test("String"), regexp.test("String")가 있다.





참고)
https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Regular_Expressions
https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Regular_Expressions
https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-%EC%A0%95%EA%B7%9C%EC%8B%9D-RegExp-%EB%88%84%EA%B5%AC%EB%82%98-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-%EC%89%BD%EA%B2%8C-%EC%A0%95%EB%A6%AC

profile
https://lying-lettuce-69f.notion.site/KyoungchanCho-Blog-f9f150b9e3be4467a67cf2a21932650d (게시글 자동 비공개 현상으로 일단 노션으로 이동합니다. 소개에서 URL 링크 클릭으로 연결됩니다.)

0개의 댓글