26일차 알고리즘

자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.

제한사항
n은 1 이상 100,000,000 이하인 자연수입니다.
입출력 예

n	result
45	  7
125	 229

입출력 예 설명
입출력 예 #1

답을 도출하는 과정은 다음과 같습니다.

n (10진법)	n (3진법)	앞뒤 반전(3진법)	10진법으로 표현
  45		1200		0021			7

따라서 7을 return 해야 합니다.
입출력 예 #2

답을 도출하는 과정은 다음과 같습니다.

n (10진법)	n (3진법)	앞뒤 반전(3진법)	10진법으로 표현
125				11122	  22111			229

따라서 229를 return 해야 합니다.

function solution(n) {
    n = n.toString(3)
         .split("")
         .reverse()
         .join("")
    console.log(n)
    return parseInt( n, 3)
}

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'이 최소 하나 이상 포함되어 있습니다.
입출력 예

	s			result
"110010101001"	[3,8]
"01110"			[3,3]
"1111111"		[4,1]
입출력 예 설명

입출력 예 #1

"110010101001"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차 이진 변환 이전 제거할 0의 개수 0 제거 후 길이 이진 변환 결과

1	"110010101001"	6	6	"110"
2		"110"	    1	2	"10"
3		"10"	    1	1	"1"

3번의 이진 변환을 하는 동안 8개의 0을 제거했으므로, [3,8]을 return 해야 합니다.
입출력 예 #2

"01110"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차 이진 변환 이전 제거할 0의 개수 0 제거 후 길이 이진 변환 결과

1	"01110"	2	3	"11"
2	"11"	0	2	"10"
3	"10"	1	1	"1"

3번의 이진 변환을 하는 동안 3개의 0을 제거했으므로, [3,3]을 return 해야 합니다.
입출력 예 #3

"1111111"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차 이진 변환 이전 제거할 0의 개수 0 제거 후 길이 이진 변환 결과

1	"1111111"	0	7	"111"
2	"111"	0	3	"11"
3	"11"	0	2	"10"
4	"10"	1	1	"1"

4번의 이진 변환을 하는 동안 1개의 0을 제거했으므로, [4,1]을 return 해야 합니다.

function solution(s) {
let count = 0 //총 시도한 횟수
let remove = 0 //0이 제거된 총 횟수

    
    //s가 "1"이 되지 않을 때까지, ("1"이 되면 중단)
    while( s !== "1" ){
        count++
        //"1"만 담는 변수
        let temp = ""
        //"0"을 제거하는 반복문
        for(let i = 0; i < s.length; i++){
            if( s[i] === "0"){
                //"0"을 발견했다면, temp 변수에 "0"을 넣지 않는다.
                remove++
                continue
            }
            //temp 에는 "1"만 담는다.
            temp += s[i]
        }
        s = temp.length
        // s를 2진법으로 변환한 데이터의 결과가 "1"이라면 반복문이 종료
        s = s.toString(2)
        //console.log(s, count, remove, temp)
    }
    //console.log(count, remove)
    return [count, remove]
  }

다른풀이

function solution(s) {
    let [count, remove] = [0, 0]
    
    function recursion(){
        if( s === "1" ){
            return [count, remove]
        }
        // 0을 제거
        remove += s.split("").filter(el => el === "0").length
        // 0이 제거된 1만 남은 문자열의 길이값을 2진법으로 변환
        s = s.split("").filter(el => el === "1").length
        s = s.toString( 2 )
        //console.log(s, remove)
        count++
        return recursion()
    }
    return recursion()
}

좋은 웹페이지 즐겨찾기