[level 1] [1차]다트 게임

2022. 1. 23. 11:44·알고리즘/JavaScript

문제

풀이 코드

function solution(dartResult) {
  let scoreSplit = dartResult.match(/\d.?\D/g);
  let count = new Array(3).fill(0);

  count = scoreSplit.map((item, index) => {
    for (let i = 0; i < item.length; i++) {
      if (!isNaN(item[i])) {
        count[index] = count[index] * 10 + Number(item[i]);
      } else if (item[i] === 'S') {
        count[index] **= 1;
      } else if (item[i] === 'D') {
        count[index] **= 2;
      } else if (item[i] === 'T') {
        count[index] **= 3;
      } else if (item[i] === '*') {
        count[index] *= 2;
        count[index - 1] *= 2;
      } else if (item[i] === '#') {
        count[index] *= -1;
      }
    }
    return count;
  });
  return count[0].reduce((sum, item) => sum + item, 0);
}

 

풀이 과정

스스로 해결하지 못하여 검색을 통해 힌트를 얻었다.

정규식을 이용해 패턴을 분리하고, 패턴을 map 함수를 통해 계산을 처리하게 구현하였다.

 

다만, 수행하면서 map 에서 2차원 배열을 반환하고, 실질적으로 해당 2차원 배열은 같은 값들이 들어있는 동일한 배열 3개가 저장된 배열이다, 
이부분이 너무 비효율 적이라고 생각했지만, 도저히 방법이 생각나지 않았다. 그래서 다른 사람의 풀이를 많이 찾아 보았다.

 

* 다른 사람의 풀이를 보며 해당 솔루션에도 문제가 있는것을 발견했다.

테스트는 통과했지만 "1S1S10S#" 에 대해 -8 이 반환되어야 하지만 전혀 다른 값이 반환된다.

 

정규식을

/\d\d?.?\D/g

로 수정하면 해당 문제도 처리 가능하다.

 

정규식에 대해서도 조금더 깊이 공부 해봐야 겠다.

 

다른사람의 코드

// 방법1. 정규식 X
function solution(dartResult) {
   let calArr = [];
    let score = 0;
    
    for (let i = 0; i < dartResult.length; i++) {
        if (!isNaN(dartResult[i])) {
            score = dartResult[i-1] == '1' ? 10 : dartResult[i]
        } else if (dartResult[i] === 'S') {
            calArr.push(score**1);
        } else if (dartResult[i] === 'D') {
            calArr.push(score**2);
        } else if (dartResult[i] === 'T') {
            calArr.push(score**3);
        } else if (dartResult[i] === '*') {
            calArr[calArr.length - 1] *= 2; 
            calArr[calArr.length - 2] *= 2; 
        } else if (dartResult[i] === '#') {
            calArr[calArr.length - 1] *= -1; 
        } 
    }
    console.log(calArr)
    return calArr.reduce((sum,item) => sum + item, 0)
}

// 방법2. 정규식 사용
function solution(dartResult) {
    const bonus = { 'S': 1, 'D': 2, 'T': 3 },
          options = { '*': 2, '#': -1, undefined: 1 };

    let darts = dartResult.match(/\d.?\D/g);

    for (let i = 0; i < darts.length; i++) {
        let split = darts[i].match(/(^\d{1,})(S|D|T)(\*|#)?/),
            score = Math.pow(split[1], bonus[split[2]]) * options[split[3]];

        if (split[3] === '*' && darts[i - 1]) darts[i - 1] *= options['*'];

        darts[i] = score;
    }

    return darts.reduce((a, b) => a + b);
}

이 문제는 조금더 공부해야 할것 같다.

 

너무 어려웠다.

'알고리즘/JavaScript' 카테고리의 다른 글
  • [level 1] 나머지가 1이 되는 수 찾기
  • [level 1] 가운데 글자 가져오기
  • [level 1] 같은 숫자는 싫어
  • [level 1] 나누어 떨어지는 숫자 배열
Jeohong
Jeohong
기억 보단 기록을
  • Jeohong
    Chikong Devlog
    Jeohong
  • 전체
    오늘
    어제
    • 분류 전체보기 (186)
      • ---- 개발 컨텐츠 ---- (0)
      • iOS (30)
        • Swift 문법 (1)
        • iOS 개념 (12)
        • HIG (5)
        • SwiftUI (7)
        • UIKit (4)
      • Side Project (0)
      • 개발서적 (4)
        • 객체지향 사실과 오해 (4)
      • 알고리즘 (74)
        • 자료구조 개념 (2)
        • Swift (25)
        • JavaScript (47)
      • ---- 회고 계획 컨텐츠 ---- (0)
      • 계획 및 일기 (10)
      • 회고록 (1)
      • 컨퍼런스 탐방 (1)
      • 미드로 영린이 탈출하기 (1)
      • ---- Previous content ---- (0)
      • Frontend (2)
        • HTML & CSS (2)
      • KITRI 수업 (17)
        • 리눅스 (14)
        • 네트워크 (2)
      • 42seoul (17)
        • Bonr2code (9)
        • 넋두리 (7)
        • 멘토특강 (1)
      • 해킹 실습 (20)
        • 해커스쿨 - F.T.Z (19)
        • WebGoat (1)
      • Tensorflow로 시작하는 NLP (1)
        • 예제 (1)
      • 자연어처리 입문 (1)
        • 이론 (1)
      • 텐서플로로 배우는 딥러닝 (7)
        • 이론 (2)
        • 예제 (5)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코딩
    boj
    42서울
    javascript
    백준
    42seoul
    SwiftUI
    프로그래머스
    라피신
    본과정
    개발자
    1서클
    자료구조
    hig
    스위프트
    네트워크
    Algorithm
    알고리즘
    swift
    IOS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Jeohong
[level 1] [1차]다트 게임
상단으로

티스토리툴바