[알고리즘] 프로그래머스 - 이진 변환 반복하기

do_large·2021년 1월 25일
0

알고리즘

목록 보기
37/50
post-thumbnail

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

문제설명
0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.

  • x의 모든 0을 제거합니다.
  • x의 길이를 c라고 하면, x를 c를 2진법으로 표현한 문자열로 바꿉니다.
    예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.
    0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 1이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.

제한사항

  • s의 길이는 1 이상 150,000 이하입니다.
  • s에는 '1'이 최소 하나 이상 포함되어 있습니다.

입출력 예

풀이방법
고려해야할 것이 2가지가 있었다.
1. 주어진 문자열에서 0을 제거하고 1이 몇개 남았는지 찾기
2. 남은 1의 개수를 2진수로 변환하기

그리고 위의 방법을 s가 "1"이 될때까지 반복해야 한다.

아래의 코드를 보면

  • 외부에 있는 whlie문은 s가 "1"이 될때까지 반복하는 문이다.
    외부 whlie문을 한바퀴 돌때마다 repeat을 1씩 증가시켜서 총 이진변환이 몇번 진행되었는지에 대한 값을 가지고 있다.

  • 외부 while문 안으로 들어가서 보면,
    countOne이라는 변수에 s가 가진 1의 개수를 담는다.
    그리고 내부 whlie문을 돌면서 s 배열의 뒷자리부터 값을확인한다.
    그리고 검사한 값은 pop을 사용해 배열에서 제거해 준다.

  • 2진수를 10진수 값으로 변환하는 것은
    toString()메서드를 사용했다.
    toString의 인수로 2를 넣어주면 2진수의 값으로 변환된 문자열을 반환한다.

function solution(s) {
    let countZero = 0;
    let repeat = 0;
    while(s.length !== 1){
        let countOne = 0;
        s = s.split("");
        while(s.length){
            s[s.length-1] === "1" ? countOne++ : countZero++;
            s.pop();
        }
        s = countOne.toString(2);
        repeat++;
    }
    return [repeat, countZero]
}

toString

  • 기수를 정하여 10진수 숫자를 해당 기수의 값으로 변환하여 반환하고 싶을때 사용할 수 있다.
  • 반환값의 타입은 string이다.
    예를 들면
const x = 15;
x.toString(2); // > '1111'
x.toString(8); // > '17'

toString과 반대?의 결과를 도출하는 메서드도 있다.

  • parseInt는 전달받은 문자열 인수를 정수로 해석해서 반환하는데,
    - parseInt의 두번째 인수로 기수를 지정하면 첫번째 인수로 전달된 문자열을 해당 기수의 숫자로 해석해서 반환한다.
    - 반환된 값은 항상 10진수이다.
// '10'을 2진수로 해석하고 그 결과를 10진수로 반환한다.
parseInt('10', 2); // 2

0개의 댓글