ν‹°μŠ€ν† λ¦¬ λ·°

문제

μΉ΄μΉ΄μ˜€ν†‘ κ²Œμž„λ³„μ˜ ν•˜λ°˜κΈ° μ‹ κ·œ μ„œλΉ„μŠ€λ‘œ λ‹€νŠΈ κ²Œμž„μ„ μΆœμ‹œν•˜κΈ°λ‘œ ν–ˆλ‹€. λ‹€νŠΈ κ²Œμž„μ€ λ‹€νŠΈνŒμ— λ‹€νŠΈλ₯Ό μ„Έ μ°¨λ‘€ 던져 κ·Έ 점수의 ν•©κ³„λ‘œ μ‹€λ ₯을 κ²¨λ£¨λŠ” κ²Œμž„μœΌλ‘œ, λͺ¨λ‘κ°€ κ°„λ‹¨νžˆ 즐길 수 μžˆλ‹€.
κ°“ μž…μ‚¬ν•œ λ¬΄μ§€λŠ” μ½”λ”© μ‹€λ ₯을 인정받아 κ²Œμž„μ˜ 핡심 뢀뢄인 점수 계산 λ‘œμ§μ„ 맑게 λ˜μ—ˆλ‹€. λ‹€νŠΈ κ²Œμž„μ˜ 점수 계산 λ‘œμ§μ€ μ•„λž˜μ™€ κ°™λ‹€.

  1. λ‹€νŠΈ κ²Œμž„μ€ 총 3번의 기회둜 κ΅¬μ„±λœλ‹€.
  2. 각 κΈ°νšŒλ§ˆλ‹€ 얻을 수 μžˆλŠ” μ μˆ˜λŠ” 0μ μ—μ„œ 10μ κΉŒμ§€μ΄λ‹€.
  3. μ μˆ˜μ™€ ν•¨κ»˜ Single(S), Double(D), Triple(T) μ˜μ—­μ΄ μ‘΄μž¬ν•˜κ³  각 μ˜μ—­ 당첨 μ‹œ μ μˆ˜μ—μ„œ 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으둜 κ³„μ‚°λœλ‹€.
  4. μ˜΅μ…˜μœΌλ‘œ μŠ€νƒ€μƒ(*) , 아차상(#)이 μ‘΄μž¬ν•˜λ©° μŠ€νƒ€μƒ(*) 당첨 μ‹œ ν•΄λ‹Ή μ μˆ˜μ™€ λ°”λ‘œ 전에 얻은 점수λ₯Ό 각 2배둜 λ§Œλ“ λ‹€. 아차상(#) 당첨 μ‹œ ν•΄λ‹Ή μ μˆ˜λŠ” λ§ˆμ΄λ„ˆμŠ€λœλ‹€.
  5. μŠ€νƒ€μƒ(*)은 첫 번째 κΈ°νšŒμ—μ„œλ„ λ‚˜μ˜¬ 수 μžˆλ‹€. 이 경우 첫 번째 μŠ€νƒ€μƒ(*)의 점수만 2λ°°κ°€ λœλ‹€. (예제 4번 μ°Έκ³ )
  6. μŠ€νƒ€μƒ(*)의 νš¨κ³ΌλŠ” λ‹€λ₯Έ μŠ€νƒ€μƒ(*)의 νš¨κ³Όμ™€ 쀑첩될 수 μžˆλ‹€. 이 경우 μ€‘μ²©λœ μŠ€νƒ€μƒ(*) μ μˆ˜λŠ” 4λ°°κ°€ λœλ‹€. (예제 4번 μ°Έκ³ )
  7. μŠ€νƒ€μƒ(*)의 νš¨κ³ΌλŠ” 아차상(#)의 νš¨κ³Όμ™€ 쀑첩될 수 μžˆλ‹€. 이 경우 μ€‘μ²©λœ 아차상(#)의 μ μˆ˜λŠ” -2λ°°κ°€ λœλ‹€. (예제 5번 μ°Έκ³ )
  8. Single(S), Double(D), Triple(T)은 μ μˆ˜λ§ˆλ‹€ ν•˜λ‚˜μ”© μ‘΄μž¬ν•œλ‹€.
  9. μŠ€νƒ€μƒ(*), 아차상(#)은 μ μˆ˜λ§ˆλ‹€ λ‘˜ 쀑 ν•˜λ‚˜λ§Œ μ‘΄μž¬ν•  수 있으며, μ‘΄μž¬ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€.

0~10의 μ •μˆ˜μ™€ 문자 S, D, T, *, #둜 κ΅¬μ„±λœ λ¬Έμžμ—΄μ΄ μž…λ ₯될 μ‹œ 총점수λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜λΌ.

μž…λ ₯ ν˜•μ‹

"점수|λ³΄λ„ˆμŠ€|[μ˜΅μ…˜]"으둜 이루어진 λ¬Έμžμ—΄ 3μ„ΈνŠΈ.
예) 1S2D*3T

  • μ μˆ˜λŠ” 0μ—μ„œ 10 μ‚¬μ΄μ˜ μ •μˆ˜μ΄λ‹€.
  • λ³΄λ„ˆμŠ€λŠ” S, D, T 쀑 ν•˜λ‚˜μ΄λ‹€.
  • μ˜΅μ„ μ€ *μ΄λ‚˜ # 쀑 ν•˜λ‚˜μ΄λ©°, 없을 μˆ˜λ„ μžˆλ‹€.

좜λ ₯ ν˜•μ‹

3번의 κΈ°νšŒμ—μ„œ 얻은 점수 합계에 ν•΄λ‹Ήν•˜λŠ” μ •μˆ˜κ°’μ„ 좜λ ₯ν•œλ‹€.
예) 37

μž…μΆœλ ₯ 예제

예제dartResultanswerμ„€λͺ…

1 1S2D*3T 37 11 * 2 + 22 * 2 + 33
2 1D2S#10S 9 12 + 21 * (-1) + 101
3 1D2S0T 3 12 + 21 + 03
4 1S*2T*3S 23 11 * 2 * 2 + 23 * 2 + 31
5 1D#2S*3S 5 12 * (-1) * 2 + 21 * 2 + 31
6 1T2D3D# -4 13 + 22 + 32 * (-1)
7 1D2S3T* 59 12 + 21 * 2 + 33 * 2

 

μ½”λ“œ

function solution(dartResult) {
  var answer = 0;
  let regExp = /[0-9]/;
  let section = ['S', 'D', 'T'];
  let scores = [];
  let score = 0;
  
  for(let i = 0; i < dartResult.length; i++) {
      if(regExp.test(dartResult[i])) {
          score = 0;
          score = Number(dartResult[i]);
    }
      if(section.includes(dartResult[i])) {
          score = Math.pow(score, section.indexOf(dartResult[i]) + 1);
          if(regExp.test(dartResult[i + 1]) || !dartResult[i + 1]) scores.push(score);
      }
      if(dartResult[i] === '*') {
          if(scores.length === 0) scores.push(score * 2);
          else {
              scores.push(score * 2);
              scores[scores.length - 2] = scores[scores.length - 2] * 2;
          }
      }
      if(dartResult[i] === '#') scores.push(-score);
  }
  
  answer = scores.reduce((a, b) => a + b);
  return answer;
}

 

μ˜€λ‹΅

2번 쑰건인 '각 κΈ°νšŒλ§ˆλ‹€ 얻을 수 μžˆλŠ” μ μˆ˜λŠ” 0μ μ—μ„œ 10μ κΉŒμ§€μ΄λ‹€.'λ₯Ό μƒκ°ν•˜μ§€ λͺ»ν–ˆλ‹€.

 

inputκ°’μœΌλ‘œ λ“€μ–΄μ˜¨ λ¬Έμžμ—΄ 자체λ₯Ό μˆœνšŒν•˜λ‹€ λ³΄λ‹ˆ 두 자릿수인 10점을 μ •μˆ˜ 10을 κ·ΈλŒ€λ‘œ 점수둜 μΉ˜ν™˜ν•˜λŠ” 것이 μ•„λ‹Œ μ •μˆ˜ 1κ³Ό 0으둜 λ‚˜λˆ„μ–΄ 점수둜 μΉ˜ν™˜ν•˜λŠ” λ°”λžŒμ— ν•΄λ‹Ή ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ—μ„œ 였λ₯˜κ°€ λ°œμƒν•˜μ˜€λ‹€.

 

λ‹€μŒκ³Ό 같이 λ¬Έμžμ—΄ μ•žλ’€μ˜ λ¬Έμžκ°€ μˆ«μžμΈμ§€ λ¬Έμžμ—΄μΈμ§€μ— λ”°λΌμ„œ μ •μˆ˜ 10을 κ΅¬λΆ„ν•˜μ˜€κ³  문제 없이 λ™μž‘ν•¨μ„ ν™•μΈν•˜μ˜€λ‹€.

function solution(dartResult) {
  var answer = 0;
  let regExp = /[0-9]/;
  let section = ['S', 'D', 'T'];
  let scores = [];
  let score = 0;
  
  for(let i = 0; i < dartResult.length; i++) {
      if(regExp.test(dartResult[i])) {
            if(!regExp.test(dartResult[i - 1])) {
              score = 0;
              score = Number(dartResult[i]);
            }
            if(regExp.test(dartResult[i + 1])) score = Number(score + dartResult[i + 1]);
    }
      if(section.includes(dartResult[i])) {
          score = Math.pow(score, section.indexOf(dartResult[i]) + 1);
          if(regExp.test(dartResult[i + 1]) || !dartResult[i + 1]) scores.push(score);
      }
      if(dartResult[i] === '*') {
          if(scores.length === 0) scores.push(score * 2);
          else {
              scores.push(score * 2);
              scores[scores.length - 2] = scores[scores.length - 2] * 2;
          }
      }
      if(dartResult[i] === '#') scores.push(-score);
  }
  
  answer = scores.reduce((a, b) => a + b);
  return answer;
}

console.log(solution('1D2S#10S'));

 

λ‹€λ₯Έ μ‚¬λžŒ 풀이

function solution(dartResult) {
    const bonus = {'S': 1, 'D': 2, 'T': 3};
    let darts = dartResult.match(/\\d.?\\D/g);

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

        if (split[3] !== undefined) {
            if (split[3] === '*') {
                score *= 2;

                if (i > 0) darts[i - 1] *= 2;
            } else score *= -1;
        }

        darts[i] = score;
    }

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

μ •κ·œν‘œν˜„μ‹κ³Ό match() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 3번의 기회λ₯Ό λ°°μ—΄λ‘œ λ‚˜λˆˆ 점이 쒋은 것 κ°™λ‹€.

 

이둜 인해 이후 반볡 μ—°μ‚°μ—μ„œ μš”μ†Œμ— 더 μ‰½κ²Œ μ ‘κ·Όν•  수 있으며 각 κΈ°νšŒμ— λŒ€ν•œ μ—°μ‚° 과정이 λͺ…확해진 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμ—ˆλ˜ 것 κ°™λ‹€.

 

λ‹€λ§Œ μ •κ·œν‘œν˜„μ‹μ˜ μ‚¬μš©μ— μžˆμ–΄μ„œ μ‹€μˆ˜λ₯Ό ν•˜μ‹  것 같은데, /\d.?\D/g 둜 μˆ˜μ •ν•΄μ•Όμ§€ μ œλŒ€λ‘œ λ™μž‘ν•œλ‹€.

(뒀에 split λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œλ„ μ—­μŠ¬λž˜μ‰¬ ν•˜λ‚˜λ₯Ό λΉΌμ€˜μ•Ό ν•œλ‹€)

 

점수λ₯Ό 계산할 λ•Œ split[1]λΆ€ν„° μ°Έμ‘°ν•˜λŠ” μ΄μœ κ°€ κΆκΈˆν•΄μ„œ λ‹€μŒκ³Ό 같이 μ•½μ‹μœΌλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ—¬ μ½˜μ†”λ‘œ κ·Έ 결과값을 ν™•μΈν•˜μ˜€λ‹€.

let dartResult = '3D4T#2S*';
let darts = dartResult.match(/\d.?\D/g);
console.log(darts);
for(let i = 0; i < darts.length; i++) {
  let split = darts[i].match(/(\d{1,})([SDT])([*#])?/)
  console.log(split); 
}

 

β–Ά(3) ["3D", "4T#", "2S*"] 

β–Ά(4) ["3D", "3", "D", undefined]
β–Ά(4) ["4T#", "4", "T", "#"]
β–Ά(4) ["2S*", "2", "S", "*"]

κ²°κ³Όλ₯Ό 확인해 λ³΄λ‹ˆ match λ©”μ„œλ“œλ‘œ λ‚˜λˆˆ λ°°μ—΄μ˜ 맨 처음 인덱슀 μš”μ†Œμ—λŠ” ν˜„μž¬ 참쑰되고 μžˆλŠ” λ¬Έμžμ—΄ κ·Έ 자체λ₯Ό λ°˜ν™˜ν•˜λŠ” 것을 μ•Œ 수 μžˆμ—ˆλ‹€.

λ¬Έμžμ—΄μ΄ μ •κ·œμ‹κ³Ό μΌμΉ˜ν•˜λ©΄, μΌμΉ˜ν•˜λŠ” 전체 λ¬Έμžμ—΄μ„ 첫 번째 μš”μ†Œλ‘œ ν¬ν•¨ν•˜λŠ” Arrayλ₯Ό λ°˜ν™˜ν•œ λ‹€μŒ κ΄„ν˜Έ μ•ˆμ— 캑처된 κ²°κ³Όκ°€ μ˜΅λ‹ˆλ‹€. μΌμΉ˜ν•˜λŠ” 것이 μ—†μœΌλ©΄ null이 λ°˜ν™˜λ©λ‹ˆλ‹€.

 

λŒ“κΈ€
곡지사항
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€
Total
Today
Yesterday
링크
TAG
more
Β«   2025/01   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
κΈ€ 보관함