ComputerScience/알고리즘, 프로그래머스
[Lv.1] 다트게임(정규식, string메소드, 조건반복문 혼합) (카카오)
VictorMeredith
2023. 2. 2. 09:50
1. 문제
2. 전략
1) 정규식을 통해 [점수영역, (보너스), 점수영역, (보너스), 점수영역, (보너스)] 형태의 배열로 만든다
2) 배열을 순회하며 보너스를 조건에 따라 계산해준다.
3) 배열 중 점수영역을 합쳐서 return.
function solution(dartResult) {
var answer = 0;
let reg = /\d{1,2}\w|\*|\#/g; //정규식
// /d는 모든숫자이며 뒤에 붙은 {1,2}는 최대1개, 최대2개
// /w는 모든문자
// | 는 or 연산자이다.
// \*는 '*', \#는 '#' 이다.
let arr = dartResult.match(reg) // 정규식 메소드
// string.match(RegExp) : string에서 정규식에 match 되는 요소를 배열로 리턴해준다.
// ex) ['5S','#', '2T', '*', '3D'] 의 형태로 나온다
let res = [] //결과를 계산해서 담을 배열을 만든다
for(i in arr){ //점수의 알파벳영역부분을 계산해서 다시 재배열한다.
if(arr[i] === '#'){
res.push('#')
}
else if(arr[i] === '*'){
res.push('*')
}
else{
let word = arr[i].substr(arr[i].length-1,1)
// 문자열 자르기: string.substr(자르기시작index,몇개자를거임?)
let num = arr[i].replace(word,'');
// 문자열 교체하기(하나만삭제로도 사용) : string.replace(바꿀거, 뭐로바꿈?)
if(word === 'S'){
res.push(Math.pow(num,1))
// 제곱수 표현하기 Math.pow(밑,지수)
}
else if(word === 'D'){
res.push(Math.pow(num,2))
}
else if(word === 'T'){
res.push(Math.pow(num,3))
}
}
}
// res = [5, '#', 8, '*', 9]의 형태로 알파벳이 계산되었다.
for(j = 0; j<res.length; j++){ //다시 순회하면서 보너스영역을 계산한다
if(j !== 0 && res[j]=== '#'){ //#일 경우 이전점수를 음수로 바꾼다
res[j-1] *= -1
}
else if(j !== 0 && res[j] === '*'){ // *일경우 이전 두개의 점수가 두배가되므로
if(j === 1){ //1번째에 *이 나온 경우
res[0] *= 2
}
else if(res[j-2] ==='*' || res[j-2] === '#'){
//배열의 이전이전 요소가 점수숫자가 아닌경우
res[j-3] *= 2;
res[j-1] *=2;
}
else{
//배열의 이전이전 요소가 점수숫자인 경우
res[j-2] *=2
res[j-1] *=2
}
}
}
for(r in res){ //보너스 글자를 제외한 점수를 더한다.
if(res[r] !== '#' && res[r] !== '*'){
answer += res[r]
}
}
return answer;
}
3. 알아야할 사항
1) 정규표현식 :
- let reg = /요기에 조건을 넣는다/g : g는 글로벌에서 찾음
- let reg = new RegExp('/요기에 조건을 넣는다/',flag) : flag는 옵션이다(g는 모든곳에서 찾음, i는 대소문자 구별안함 등등 여러가지 있다. 구글링 해보자.)
- string.match(reg) : string에서 reg 정규표현식에 일치하는 글자(들)를 찾아준다.
2) 문자열과 지수
- 문자열 자르기: string.substr(자르기시작index,몇개자를거임?)
- 문자열 교체하기(하나만삭제로도 사용) : string.replace(바꿀거, 뭐로바꿈?)
- 제곱수 표현하기 Math.pow(밑,지수)