ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CodeKata] 프로그래머스 : 3.10(수), 이진 변환 반복하기
    Algorithm 2021. 3. 10. 12:32
    반응형

    🥋 Ooooth!! (Level 2)

     

    🧮 풀이

    function solution(s) {
      let answer = [0, 0];
    
      while(s !== "1") {
        const sOneLen = s.replaceAll("0", "").length;
        // const sOneLen = s.split("").filter(e => e === '1').join("").length;
        answer[0]++;
        answer[1] += s.length - sOneLen;
        s = sOneLen.toString(2);
      }
      
      return answer;
    }
    1. answer는 정답 튜플이다. 0번째는 변환 횟수, 1번째는 제거된 0의 갯수를 저장할 것이다.
    2. while 반복문을 반복한다. 종료조건은, s가 "1"이 될 때이다. "1"은 이진변환해도 "1"이므로 더 이상 진행이 불가함.
    3. sOneLen은 s에서 "0"을 제외한 길이값이 된다. 1) replaceAll([바꿀 문자], [바뀔 문자]) 메서드를 추천하지만, 프로그래머스 인식이 안되어 2) (split + filter + join) 조합으로 대체하여 풀었다. 
    4. answer[0]은 횟수이므로 1을, answer[1]은 제거된 "0" 개수이므로 (s 전체 길이 - sOneLen) 만큼 더해준다.
    5. s를 sOneLen을 이진법 변환(toString([진법])) 한 값으로 치환한다.

    * 종료조건을 s.includes("0") 로 초기 설정했다. 이 경우엔, "111111" 같은 경우가 진행되지 않으므로 위처럼 수정하게 된 것이다.


    🥋 Another One! : JS 100제(#98), 청길이의 패션 대회

    🧮 풀이

    const chungil = (str) => {
      return str
        .split(" ")
        .filter((_,i) => i%2 === 1)
        .join(",")
        .split(",")
        .reduce((acc, cur) => acc.includes(cur) ? acc : [...acc, cur], [])
        .map(e => Number(e))
    }
    1. space로 split(" ") 하면, "1번" -> "4,2,3" -> "2번" -> "3" .... 순으로 반복된다. 이를 홀수 인덱스의 숫자모음들만 filter 한다.
    2. 이를, join(",") 한 뒤, 다시 콤마로 split(",") 하면 각각의 모든 숫자들로 이루어진 1차원 배열로 만들 수 있다.
    3. 이를, reduce를 통해 중복값을 제거한다. 마지막으로, 반환형태가 숫자이므로 각 요소에  map을 통해 Number() 처리를 한다.

    * 처음엔, join + split이 아닌 map(e => e.split) + flat 조합을 사용했다. 위는, 동기의 풀이에서 차용한 것으로 훨씬 효율적이다.


    🖇 리뷰

    알고리즘을 풀수록, 다양한 매서드의 활용을 경험할 수 있어서 흥미롭고 유익하다.

    동기들과 추가문제를 풀면서, 매서드의 효율적인 활용이나 배치도 다양한 방법이 있을 수 있다는 것을 다시금 느꼈다.

        .map(e => Number(e))

    반응형
Designed by Tistory.