(알고리즘) codewars : Duplicate Encoder

호두파파·2021년 2월 19일
0

알고리즘 연습

목록 보기
2/60
post-thumbnail

문제

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.

문제해석
주어진 문자열에서 각각의 문자 중 같은 문자가 1개 나오면 '(', 2개 이상 나오면 ')'로 치환하여 새로운 문자열ㅇ르 만들어라. (대소문자 없이 구분해 비교하시오)

예시

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

풀이

문제의 인자로 제시된 문자열의 각 문자 중에 같은 것이 있다면 ")" 없다면 "("로 문자를 바꾸거나, 새로운 배열이나 문자를 누적해 답안을 제출하는 문제다.

단순 누적으로는 문제가 해결되지 않는다.
반복문을 돌든, map을 돌려서 배열을 살펴보든 문자가 2번 이상 중복되면 ")"로 치환되어야 한다. 따라서 이 문제는 단순한 누적이 아닌 '치환'을 해서 풀어야 하는 문제이다.

for문과 객체를 통해서 문제 풀기

배열의 요소를 객체의 키 값으로 등록시켜, 중복될때마다 카운터를 1번씩 더해준다. 그렇게 만들어진 객체를 바탕으로 다시 배열의 길이만큼 반복문을 돌며, 객체의 값을 조회하며 문자를 치환해준다.

function solution(s) {
  let answer = '';
  let obj = {};
  let arr = s.toLowerCase().split('');
  
  for (let i = 0; i < arr.length; i++) {
    if (obj[arr[i]]) {
      obj[arr[i]] += 1;
    } else {
      obj[arr[i]] = 1;
    }
  }
  for (let j = 0; j < arr.length; j++) {
    if (obj[arr[j]] === 1) {
      answer += '(';
    } else {
      answer += ')';
    }
  }
  return answer;
}

const s = 'Din';
const n = 'Success';
console.log(solution(s));
console.log(solution(n));


map 매소드로 배열 자체를 변환시키기

function duplicateEncode(word){
  return word
    .toLowerCase()
    .split('')
    .map( function (a, i, w) {
      return w.indexOf(a) == w.lastIndexOf(a) ? '(' : ')' 
    })
    .join('');
}

map()안의 콜백함수를 통해 문제를 해결할 수 있다. lastIndexOf(a)메소드는 w배열 안에서 a값과 일치하는 마지막 index 값을 리턴해준다. 즉 첫번째 인덱스 값과 마지막 인덱스 값이 같다는 말은 곧 a라는 글짜가 전체 요소 중에 중복되는 값이 있다는 이야기가 된다.

다른 문제 풀이

function duplicateEncodess(word) {
    var letters = word.toLowerCase().split('')
    return letters.map(function(c, i) {
        return letters.some(function(x, j) { return x === c && i !== j }) ? ')' : '('
    }).join('')
}

some() 메소드를 사용한 리턴 반환식

profile
안녕하세요 주니어 프론트엔드 개발자 양윤성입니다.

0개의 댓글