이 연습의 목표는 문자열을 새 문자열로 변환하여 새 문자열의 각 문자가 "("
해당 문자가 원래 문자열에서 ")"
한 번만 나타나는 경우 또는 해당 문자가 원래 문자열에서 두 번 이상 나타나는 경우입니다. 문자가 중복인지 여부를 결정할 때는 대문자를 무시하십시오.
"din" => "((("
"recede" => "()()()"
"Success" => ")())())"
"(( @" => "))(("
Code language: PHP (php)
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);
}
Code language: JavaScript (javascript)
이런 중복 문제는 어떤 방식으로 접근해야할까? 이 부분을 먼저 찾아보고 공부해보자
예상으로는 해시 관련 문제인것 같다.