본문 바로가기
코테연습

116. 이진 변환 반복하기 Javascript

by hxunz 2022. 9. 12.

https://school.programmers.co.kr/learn/courses/30/lessons/70129

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
      - s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return
  • 주어진 자료는 무엇인가?
     - 0과 1로 이루어진 문자열 s
  • 조건은 무엇인가?
     - 0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.
    1. x의 모든 0을 제거합니다.
    2. x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.

2. 계획

  1. s의 0의 개수를 구한다
  2.  s의 모든 0을 제거합니다.
  3.  s의 길이를 c라고 하면, s를 "c를 2진법으로 표현한 문자열"로 바꿉니다.

3. 실행

  • 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.

첫번째 풀이

const solution = (s) => {
  let change = 0;
  let count = 0;

  while (s !== '1') {
    for (i = 0; i < s.split('').length; i++) {
      if (s[i] === '0') {
        count++
      }
    }
    change++;
    s = s.split('').filter((it) => it !== '0').join('').length.toString(2);
  }

  return [change, count]
}

 

두번째 풀이

const solution = (s, change = 0, count = 0) => {
  if (s === '1') {
    return [change, count]
  }

  //s의 0의 개수를 구한다
  let countZero = s.split('').filter((it) => it === '0').length;
  // s의 모든 0을 제거합니다.
  let removeZero = s.split('').filter((it) => it !== '0').join('');
  // s의  길이를 c라고 하면, s를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
  let binary = removeZero.length.toString(2);

  return solution(binary, change += 1, count += countZero)
}

4. 반성

  • 처음에 재귀로 풀어보려고 했는데 잘 되지 않았다. 그래서 반복문을 사용했다. 
  • 반복문으로 풀고 나니 재귀로 풀려고 했던 코드가 틀리지 않았음을 알았고 반복문으로 푼 코드는 일부 테스트 코드에서 시간초과가 났다.
  • 재귀로 다시 풀어보려는데 가장 중요한 함수를 안넘겨주고 있었다는 것을 알았고 함수를 입력해주면서 재귀를 완성시킬 수 있었다. 

 

댓글