Duplicate Encoder ( 6 kyu )
문제
The goal of this exercise is to convert a string to a new string where each character in the new string is ‘(‘ if that character appears only once in the original string, or ‘)’ if that character appears more than once in the original string. Ignore capitalization when determining if a character is a duplicate.
Examples:
"din" => "((("
"recede" => "()()()"
"Success" => ")())())"
"(( @" => "))(("
중복이 되는 단어면 ), 중복되지 않으면 (로 치환해 출력하는 문제, 대소문자는 구분하지 않는다.
풀이
function duplicateEncode(word){
let obj = {}, result = '';
word = word.toLowerCase();
for ( let i = 0; i < word.length; i++ ) {
if ( obj[word[i]] ) {
obj[word[i]] += 1;
} else {
obj[word[i]] = 1;
}
}
for ( let j = 0; j < word.length; j++ ) {
if ( obj[word[j]] === 1 ) {
result += '(';
} else {
result += ')';
}
}
return result;
}
우선 대소문자를 구별하지 않기 때문에, 전부 소문자로 치환해주고,
첫 번째 포문에서는 obj에 갯수를 저장해 놓고
두 번째 포문에서는 문자열을 돌면서 obj에서 개수를 확인해 if문으로 result에 ( 또는 )를 추가하고 리턴
다른 사람의 풀이
function duplicateEncode(word){
return word
.toLowerCase()
.split('')
.map( function (a, i, w) {
return w.indexOf(a) == w.lastIndexOf(a) ? '(' : ')'
})
.join('');
}
다른 문제에서 접근한 방법인 indexOf와 lastIndexOf를 비교하는 방법으로 map 으로 사용한 것!
왜 map에 인자를 세개나 주었을까 찾아보니, 순서대로 배열에서 현재 처리되는 요소, 인덱스, 배열을 나타낸 것이다.
익혀두면 좋을 것 같다.