알고리즘/프로그래머스 - JS

[프로그래머스-JS] [카카오][1차] 다크게임 <문자열 처리>

개발자성장기 2022. 7. 26. 06:24
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/17682

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

나의 풀이

 

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', '' ]

이렇게 구분지어 줬다.

반응형