[Codewars#6kyu] - Duplicate Encoder

jihye·2022년 6월 3일
0

알고리즘

목록 보기
1/12

문제

주어진 문자열 중 하나라도 겹치는 문자가 있다면 겹치는 문자는 ')' 로,
겹치지 않는 문자는 '('로 표현


첫 번째 풀이

  1. 문자를 배열로 바꾸어 배열을 차례대로 돌면서,
    정규식 표현을 사용해 주어진 문자열 중 겹치는 문자의 수를 구한다.
  2. 겹치는 문자의 수는 1보다 클테니 해당 배열 차례에서 1보다 크면 ')', 작으면 '('로 표기하여 빈 배열에 push한다.
  3. 의도한 대로 출력 성공
function duplicateEncode(word){
   const string = word.split('');
   let arr = []
    string.forEach(w => {
        let pattern = w;
        let regexAllCase = new RegExp(w, "gi");
        const result = word.match(regexAllCase).length;
        if (result > 1){ 
            pattern = ')'
            arr.push(pattern);
        }else if(result == 1){
            pattern = '('
            arr.push(pattern);
        }
    });
    const atr = arr.join('')
    console.log(atr)
}

duplicateEncode('Success') 

그런데 이렇게 푸니까 특수문자가 들어갈 경우 에러가 났다..
정규표현식 안에 (,),@ 이런 특수문자가 들어가니 정규표현식을 사용하지 못 했다 ㅠㅠ
그래서 다시 시도하게 된 두번째 풀이..


두 번째 풀이

이번엔 정규식 표현이 아닌 같은 문자열 개수로 파악하기..
split(문자).length -1 해주면 반복되는 문자열의 length 가 파악된다.
하지만 이번에도 실패... ㅡㅡ!!!!
string[0] 는 이전과 비교할 대상이 없으니 당연히 "length == 1"을 반환한다.
그래서 반복되는 문자가 첫 번째 자리에 있을 경우를 찾지 못 하여 실패

function duplicateEncode(word){
   const string = word.split('');
   let arr = []

    string.forEach(w => {
        let pattern = w;
        let test = word.split(w).length -1;
        console.log(test)
        if (test > 1){ 
            pattern = ')'
            arr.push(pattern);
        }else if(test == 1){
            pattern = '('
            arr.push(pattern);
        }
    });
    const atr = arr.join('')
}

duplicateEncode('Success')

세 번째 풀이

드디어 풀었다!!!!!!
indexOf, filter, 정규식 사용한 match, length 등등..
이런 저런 방법 다 쓰다가 드디어 해결!!

function duplicateEncode(word){
  //모든 문자 소문자로 
  const lowerCase = word.toLowerCase()
  //문자 배열화
  const stringArr = lowerCase.split('');
  // 결과 담길 빈 배열 선언
  let resultArr = [] 

  stringArr.filter((item) => {
    let text = item;
    //문자배열에서 문자 하나씩 돌면서, 
    //현재 문자 앞에서 찾은 index 위치와 현재 문자 뒤에서 찾은 index를 비교하여 
    //같다면 같은 문자 0, 다르면 같은 문자 >= 1 
   stringArr.indexOf(item) !== stringArr.lastIndexOf(item) ? 
        text = ')' : text='('

    resultArr.push(text);
  });
  return resultArr.join('')
}

너모 뿌듯하다 ^___^
codewars 문제가 제일 재밌는 듯 👍👍👍

profile
프론트엔드 개발자

0개의 댓글