상현에 하루하루
All 개발자의 하루

duplicate Encoder

( 업데이트: )

이 연습의 목표는 문자열을 새 문자열로 변환하여 새 문자열의 각 문자가 "(" 해당 문자가 원래 문자열에서 ")" 한 번만 나타나는 경우 또는 해당 문자가 원래 문자열에서 두 번 이상 나타나는 경우입니다. 문자가 중복인지 여부를 결정할 때는 대문자를 무시하십시오.

"din" => "((("
"recede" => "()()()"
"Success" => ")())())"
"(( @" => "))(("

note
어설션 메시지는 일부 언어로 표시되는 내용이 명확하지 않을 수 있습니다. 당신이 읽을 경우 "...It Should encode XXX""XXX" 예상된 결과가 아닌 입력!

[2020-06-23] 실패

function duplicateEncode(word){
  word = word.toLowerCase();
  
  const middleResult = word.split('').reduce((acc, cur) => {
    if (acc[cur]) acc[cur]++;
    else acc[cur] = 1;
    return acc;
  }, {});
  let sortable = [];
  for (let i in middleResult) {
    sortable.push([i, middleResult[i]]);
  }
  sortable = sortable.filter(a => a[1] > 1);
  if (sortable.length === 0) return word.replace(/./g, '(');
  sortable.forEach(s => {
    if (s[0].match(new RegExp(/\\("|\\|\/|b|f|n|r|t|u[0-9]{4})/, 'g')) !== null) {
      word = word.replace(/\\("|\\|\/|b|f|n|r|t|u[0-9]{4})/g, ')');
    } else if (s[0].match(/(\)|\(|~|!)/g) !== null) {
      word = word.replace(/(\)|\(|~|!)/g, ')');
    } else {
      let reg = new RegExp(`${s[0]}`, 'g');
      word = word.replace(reg, ')');
    }
  });
  return word.replace(/[^\)]/g, '(');
}

// ----- Answer -----

const chai = require('chai');
const assert = chai.assert;
const assertEquals = assert.strictEqual;

try {
  assertEquals(duplicateEncode("din"),"(((");
  assertEquals(duplicateEncode("recede"),"()()()");
  assertEquals(duplicateEncode("Success"),")())())","should ignore case");
  assertEquals(duplicateEncode("(( @"),"))((");

  console.log('Success');
} catch (error) {
  console.log(error);
}

이런 중복 문제는 어떤 방식으로 접근해야할까? 이 부분을 먼저 찾아보고 공부해보자

예상으로는 해시 관련 문제인것 같다.