알고리즘에서 문자열로 정보가 뒤섞여 들어오는 경우가 많은데, 이때 정규표현식으로 이 문자열을 사용하기 좋게 다듬는건 필수적이다.
이때, 구분자가 없이 들어오는 경우 split 이나 replace등을 사용할수가 없는데,
이때 사용하는것이 match매소드이다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/match
String.prototype.match() - JavaScript | MDN
match() 메서드는 문자열이 정규식과 매치되는 부분을 검색합니다.
developer.mozilla.org
예를들어
https://school.programmers.co.kr/learn/courses/30/lessons/17682?language=javascript
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
다트게임 문제를 예를 들었을때
<== 데이터는 이런식 으로 주어지는데..
이걸 1S, 2D*, 3T 이렇게 구분한 뒤,
다시 index로 접근이 가능하도록 [['1', 'S'],['2', 'D', '*'],['3', 'T']] 이렇게 예쁘게 담아줘야한다.
첫번째 과정(나눠주는 과정)은 match와 정규식을 사용하면 누락되는 문자 없이 예쁘게 array에 담아준다.
여기서 조건을 정규식으로 정리해줘야하는데,
한자리이상의 숫자 필수+ SDT중 하나 필수 + *#는 옵션 으로 붙는다.
이걸 정규식으로 정리하는 과정을 보면
/ / 정규식 괄호
/\d+/ 한자리 이상의 숫자(\d는 숫자 +는 반복가능하다는것)
/\d+[SDT]/ 한자리 이상의 숫자 뒤에 SDT중 하나 반드시 옴([]괄호 하나가 한글자를 의미)
/\d+[SDT][*#]?/g [*#]? 은 둘중 하나가 올수도 있고 안올수도 있다는 뜻이고, g는 하나 말고 전체에서 다 찾으라는것.
이렇게 만들어서 match에 넣으면 이렇게 된다.
let test = "1S2D*3T";
const testArray = test.match(/\d+[SDT][*#]?/g);
console.log(testArray)
//[ '1S', '2D*', '3T' ]
오 너무 잘 나온다.
이걸 또 예쁘게 다시 담아보자.
여기서 map 을 이용해서 담아줄것임.
map은 배열의 요소를 함수로 돌려서 새로운(같은 길이의 ) 배열을 반환해준다.
여기서 map함수에서 배열을 새로 만들면, 2차원 배열이 됨.
여기서는 match 조건으로,
숫자(1자릿수이상) or SDT중 한글자 or *#에 만족 ==>> 하나의 요소로 배열에 넣어주는 조건을 담음.
이를 정규식으로 표현하면
/\d+|[SDT]|[*#]|/g
여기서 | 표시는 or인데, ||가 아니라 | 한개만 쓰는거에 유의.
score.match(/\d+|[SDT]|[*#]/g)
이렇게 하면 ['1', 'S'] 이런식으로 담긴 배열이 return되는데,
이렇게 쓰면 이제 점수를 다 예쁘게 담아줌
let test = "1S2D*3T";
const testArray = test.match(/\d+[SDT][*#]?/g);
const testArrayofArray = testArray.map(a=>a.match(/\d+|[SDT]|[#*]/g));
console.log(testArray)
//[ '1S', '2D*', '3T' ]
console.log(testArrayofArray)
//[ [ '1', 'S' ], [ '2', 'D', '*' ], [ '3', 'T' ] ]
이제 문제 풀 준비가 끝남....
하
https://school.programmers.co.kr/learn/courses/30/lessons/17682?language=javascript
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
근데 막상 점수를 잘 정리해놓으면, 문제 자체는 어렵지 않다.
조건이 워낙 구체적이라, 문제에서 요구하는 조건을 순서대로 쌓아주면 바로 완성된다.
function solution(dartResult) {
const scoreArray = dartResult.match(/\d+[SDT][*#]?/g);
//각 회차 숫자 분리하기
const scores = scoreArray.map(a=>a.match(/\d+|[SDT]|[#*]/g));
//각 요소 분리하기
let sum = [];
for (i in scores){
let tempScore = Number(scores[i][0]);
if(scores[i][1]==='D'){
tempScore = tempScore**2;
} else if(scores[i][1]==='T'){
tempScore = tempScore**3;
}
sum.push(tempScore);
if(scores[i][2]==="*"){
sum[sum.length-1] *= 2;
if(sum.length>1){
sum[sum.length-2] *= 2;
}
} else if(scores[i][2]==="#"){
sum[sum.length-1] = -(sum[sum.length-1]);
}
}
return sum.reduce((acc, curr)=>acc+curr);
}