반응형
문제 출처
https://school.programmers.co.kr/learn/courses/30/lessons/17682
문제 풀이 힌트
문제 정리)
- s는1제곱, d는2제곱, t는 3제곱
- *은 해당 점수 *2, 이전 점수 *2 (만약, 해당 점수가 첫번째라면 해당 점수만 *2)
- #은 곱하기 -1
문제 풀이 )
- 반복문을 돌려서 'S', 'D', 'T' 를 찾는다.
- 'S', 'D', 'T' 이전의 index 값 즉 숫자에다가 각각 s,d,t 곱한후 temp 배열에 push 한다. (유의할 점: 10은 두자리 수니까 예외 처리)
- '*'이 나오면 temp 배열의 마지막 숫자와 마지막의 이전 숫자를 꺼내서 또 계산해준다(*은 곱하기2)
- '#'이 나오면 temp 배열의 마지막 숫자를 꺼내서 또 계산해준다 (#은 -1 곱하기)
정답 풀이 코드
function solution(dartResult) {
let temp = []; //숫자 넣는 임시 배열
for(let i=0; i<dartResult.length; i++){ //반복문 돌리기
if(dartResult[i] == 'S'){ //S일 때
if(dartResult[i-2] === '1' && dartResult[i-1] === '0' ){ //숫자 10일 때 예외
temp.push(10)
}else{
temp.push(Math.pow(dartResult[i-1],1)) //1제곱해서 temp에 push
}
}else if(dartResult[i] === 'D'){ //D일 때
if(dartResult[i-2] === '1' && dartResult[i-1] === '0' ){ //숫자 10일 때 예외처리
temp.push(100)
}else{
temp.push(Math.pow(dartResult[i-1],2)) //2제곱해서 temp에 push
}
}else if(dartResult[i] === 'T'){ //T일 때
if(dartResult[i-2] === '1' && dartResult[i-1] === '0' ){ //숫자 10일 때 예외처리
temp.push(1000)
}else{
temp.push(Math.pow(dartResult[i-1],3)) }//3제곱해서 temp에 push
}else if(dartResult[i] === '*'){ //*일 때
let num1 = temp.pop() *2; /현재 숫자
let num2 = 0; //이전숫자
if(temp.length !== 0){ //이전숫자가 있을 때
num2 = temp.pop() *2; //이전숫자도 빼서 제곱
temp.push(num2); //다시 temp에 넣어준다.
}
temp.push(num1); //현재 숫자 temp에 push
}else if(dartResult[i] === '#'){ // #일 때,
let num1 = temp.pop() * (-1);//현재 숫자 빼서 -1 곱한다.
temp.push(num1) //temp에 다시 넣기
}
}
let answer = temp.reduce((a,b)=> a+b, 0); //temp에 있는 숫자 다 더하기
return answer;
}
Only 풀이 코드
function solution(dartResult) {
let temp = [];
for(let i=0; i<dartResult.length; i++){
if(dartResult[i] == 'S'){
if(dartResult[i-2] === '1' && dartResult[i-1] === '0' ){
temp.push(10)
}else{
temp.push(Math.pow(dartResult[i-1],1))
}
}else if(dartResult[i] === 'D'){
if(dartResult[i-2] === '1' && dartResult[i-1] === '0' ){
temp.push(100)
}else{
temp.push(Math.pow(dartResult[i-1],2))
}
}else if(dartResult[i] === 'T'){
if(dartResult[i-2] === '1' && dartResult[i-1] === '0' ){
temp.push(1000)
}else{
temp.push(Math.pow(dartResult[i-1],3)) }
}else if(dartResult[i] === '*'){
let num1 = temp.pop() *2;
let num2 = 0;
if(temp.length !== 0){
num2 = temp.pop() *2;
temp.push(num2);
}
temp.push(num1);;
}else if(dartResult[i] === '#'){
let num1 = temp.pop() * (-1);
temp.push(num1)
}
}
let answer = temp.reduce((a,b)=> a+b, 0);
return answer;
}
추천하고 싶은, 다른 사람 풀이 코드
추천하는 이유: 문제를 보고 정규식과 switch를 적극 활용해야 한다는 것을 느꼈다.
function solution(dartResult) {
const reg = /[\d]+[SDT][*#]*/g;
const input = dartResult.match(reg);
const result = [];
for (let i = 0; i < input.length; i++) {
let number = input[i].match(/[\d]+/g)[0];
const bonus = input[i].match(/[SDT]/g)[0];
const option = input[i].match(/[*#]/g);
switch (bonus) {
case 'S':
number = Number(number);
break;
case 'D':
number = Math.pow(number, 2);
break;
case 'T':
number = Math.pow(number, 3);
break;
}
result[i] = number;
if (option) {
switch (option[0]) {
case '*':
result[i - 1] *= 2;
result[i] *= 2;
break;
case '#':
result[i] *= -1;
break;
}
}
}
return result.reduce((acc, cur) => {
return acc + cur;
});
}
반응형
'알고리즘 문제 풀기' 카테고리의 다른 글
이진수 함수 dfs로 구현하기 (0) | 2024.04.05 |
---|---|
프로그래머스: 크레인 인형뽑기 게임 - javascript (구현) (0) | 2024.04.04 |
프로그래머스 : 로또의 최고 순위와 최저 순위 - javascript(이분탐색 활용) (0) | 2024.04.01 |
헷갈리는 객체 키와 값 가져오기 (for...in 반복문 /Object.keys() ) (0) | 2024.03.22 |
프로그래머스 : 신고 결과 받기 - javascript(구현 , Map) (0) | 2024.03.21 |