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