Duplicate Encoder<6 kyu>

jjanmo·2019년 12월 24일
0

Codewars에서 뒹굴기

목록 보기
1/32
  • 문제링크

  • 문제
    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개이상 나오면 ')'로 치환하여 새로운 문자열을 만들어라. 대소문자 구분없이 비교하시오.

  • 문제접근
    - 첫번째 생각 : 그냥 이중for문을 돌려서 각각의 문자를 확인하면 되지않을까?
    String.charAt()을 사용하여 구현 할 수 있다.

    • 두번째 생각 : 다른 String 혹은 Array 관련 method를 사용하는 좀 더 효율적인 방법이 존재하지 않을까?
      ex) String.includes(), String.indexOf()

      - 결국 첫번째 생각대로 풀이하였다.
  • 나의 코드

    function duplicateEncode(word){
        let newString = '';
        word = word.toLowerCase();
        for(let  i = 0; i <word.length; i++){
          let cnt = 1;
          for(let j = 0; j < word.length; j++){
            if(i !== j && word.charAt(i) === word.charAt(j)) cnt++;
          }
          if(cnt > 1) newString += ')';
          else newString += '(';
        }
        return newString;
    }
  • best solution & clever solution

    codewars에는 best solution 과 clever solution, 이 2가지 부분을 선정하고 있었다. 그런데 이 문제는 같은 풀이가 두 부문에서 1위를 차지하였다.

    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가 나오는 첫 번째 index 값과 마지막 index 값이 같다는 말은 a라는 글자는 전체 문자열에서 1개 있다는 말이고, 같지 않으면 2개 이상이 있다는 말이 된다.
    • 문자열과 배열을 자유롭게 전환 할 수 있게 해준 것은 split()과 join()이다. split(구분자)는 구분자로 끊은 각각의 문자(열)을 배열에 담아서 리턴한다. Array.join([구분자])은 배열 안의 내용을 하나의 문자열로 합쳐서 리턴한다.(단, 구분자를 적은 경우, 각각의 원소 사이에 구분자가 들어가게 됨)
    • 메서드체인으로 이어지는 이 풀이는 깔끔하다는 느낌이 들었다. 물론 무조건 짧다고 좋은 풀이는 아니지만, 여러 가지 메서드들의 활용과 한 번도 사용해 본 적이 없는 lastIndexOf(a)의 활용을 본 것만으로도 나에겐 좋은 경험이 된 풀이라고 생각한다. 문제를 풀고 풀이가 있는 경우 풀이를 확인하는데, 이 풀이는 입가에 미소를 짓게 만드는 그런 풀이랄까.

📌 처음으로 내가 푼 문제에 대해서 정리를 해본다. 지금까지 적지 않은 문제를 풀었음에도 한 번도 따로 정리를 해본 적이 없었다. TIL을 하게 되면서 이렇게 하루에 1문제씩 쉬운 문제든 어려운 문제든(아마도 점차 난이도가 올라갈 듯) 꾸준히 나름의 배움을 정리해 볼 것이다. 또한 백준이나 프로그래머스, 코드업에서 주로 뒹굴었는데, 이번엔 영어 사이트인 codewars에서 뒹굴 예정이다. 영어와도 친해지는 좋은(?) 계기가 되길 바란다.

profile
눈길을 걸어갈 때 어지럽게 걷지 말기를.

0개의 댓글