https://school.programmers.co.kr/learn/courses/30/lessons/17682
나의 풀이
function solution(dartResult) {
const classification = dartResult.match(/[0-9][0]?[A-Z]|[*|#]/g)
const box=[]
classification.map(x=>{
switch(x[x.length - 1] || x[0]){
case "S":
box.push(x.slice(0,x.length-1)**1)
break;
case "D":
box.push(x.slice(0,x.length-1)**2)
break;
case "T":
box.push(x.slice(0,x.length-1)**3)
break;
case "*":
if(box.length === 1){
box[0] *= 2
}else if(box.length ===2){
box[0] *= 2
box[1] *= 2
}else{
box[1] *= 2
box[2] *= 2
}
break;
case "#":
if(box.length === 1){
box[0] *= -1
}else if(box.length ===2){
box[1] *= -1
}else{
box[2] *= -1
}
break;
}
})
return box.reduce((acc,cur)=> acc += cur,0);
}
이거 푸는데 굉장히 오래걸렸다
원인
1. 문제를 똑바로 읽지않음
- 그래서 "*" 을 이해를 본문과 다르게함 원래 해당 점수와 바로 전에 얻은 점수만 해당되는데 그 전전까지 해버림
2. 너무 어렵게 생각함
- 나의 잘못된 사고과정
- 1) 1S2D*3T이면 1S 2D 3T를 각각 분류하고 특수문자의 위치를 찾아 다시 각각 곱해주자
- 2) 일단 분류를 어떻게하지 ? 분류하고 계산하면 각각을 다시 2을 곱해야하는데 ? 중첩일때는 그 부분만 중첩되게 하는데
노력해야하는 사고과정
1) 아 정규표현식으로 1S2D*3T를 각각 ["1S", "2D", "*", "3T"]로 구분하자
2) 배열로 구분되어 출력이 되면 switch를 통해 경우에 맞게 계산되게 하자
- 각각 계산되게 해야한다. 각각 더하고 합해버리면 나중에 2의 n제곱 배를 해주거나 -1을 곱해줘야하는데 그렇게 하지 못한다.
3) 그렇게 각각 계산이 다된 배열을 다 더해준다.
더 공부 해야할 점이나 실수한 점
1) 정규표현식 많이 잊어버렸다 다시 공부
2) switch break 마지막에 빼먹어서 "*" 작동하면 case "#"까지 작동해버림 꼭 break 넣어주기
3) reduce - 부호만 보고 알아서 -로 계산
4) 함수 중괄호 넣으면 return 써주기 함수 다시 공부
5) if / switch 문에서 or 중첩사용시 조심 https://html-jc.tistory.com/357
다른 사람 풀이
게임 이고 유지 보수를 생각했을 때 나의 기준으로 제일 코드를 잘 짰다고 생각한 코드가 있었다.
다른 사람 풀이란에는 그냥 숏코드나 엄청긴 코드가 있었는데 질문하기에 딱 좋은 코드가 있었다.모던 자바스크립트 책에 이렇게 써져있다.
코드는 동작하는 것만이 존재 목적이 아니다.
코드는 개발자를 위한 문서이기도 하다.
따라서 사람이 이해할 수 있는 코드, 즉 가독성이 좋은 코드가 좋은 코드이다.
//https://github.com/codeisneverodd/programmers-coding-test
//더 좋은 풀이가 존재할 수 있습니다.
//정답 1(🎩 refactor 220425) - codeisneverodd
function solution(dartResult) {
const regex = /\d{1,2}[SDT]{1}[*|#]?/g;
let result = [];
for (const dart of dartResult.match(regex)) {
const game = [...dart.split(/([SDT]{1})/)];
const score = game[0];
let bonus = 1;
let option = 1;
if (game[1] === "S") bonus = 1;
if (game[1] === "D") bonus = 2;
if (game[1] === "T") bonus = 3;
if (game[2] === "*") {
if (result.length !== 0) result[result.length - 1] *= 2;
option = 2;
}
if (game[2] === "#") option = -1;
result.push(score ** bonus * option);
}
return result.reduce((a, b) => a + b);
}
여기서 "1S2D*3T" 가 예제일때
이분은
console.log(dartResult.match(regex)) // [ '1S', '2D*', '3T' ]
console.log(dart) // 1S
// 2D*
// 3T
console.log(game) // [ '1', 'S', '' ]
// [ '2', 'D', '*' ]
// [ '3', 'T', '' ]
이렇게 구분지어 줬다.
'알고리즘 > 프로그래머스 - JS' 카테고리의 다른 글
[프로그래머스-JS] level.1 나누어 떨어지는 숫자 배열 (0) | 2022.07.26 |
---|---|
[프로그래머스-JS] level.1 같은 숫자는 싫어 (0) | 2022.07.26 |
[프로그래머스-JS]level.1 가운데 글자 가져오기 (0) | 2022.07.23 |
[프로그래머스-JS] level.1 [1차] 비밀지도 ★ <비트연산> (0) | 2022.07.23 |
[프로그래머스-JS] level.1 부족한 금액 계산하기 (0) | 2022.07.22 |