프로그래머스 문제풀이 21

zitto·2023년 4월 24일
0

Algorithms

목록 보기
20/22
post-thumbnail

1️⃣ 3진법 뒤집기

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


제한 조건
n은 1 이상 100,000,000 이하인 자연수입니다.


입출력 예



입출력 예 설명



문제풀이

function solution(n) {
   let answer = "";
    // while(n > 0){
    //     answer += (n % 3);
    //     n = Math.floor(n / 3); 
    // }
    answer = n.toString(3); //3진법으로 바꾸기
    let reverse = "";
    for(let i = answer.length - 1; i >= 0; i--){
        reverse += answer[i];
    }
    return parseInt(reverse, 3)
}


메소드 활용

function solution(n) {
    n = n.toString(3) // 10진법 -> 3진법으로 변환
        .split( "" ) //문자열을 배열로 변환
        .reverse() //배열의 순서를 반전
        .join( "" ) //배열을 문자열로 변환
    return parseInt(n, 3)//3진법 -> 10진법으로 변환
}

2️⃣ 이진 변환 반복하기

문제 설명
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'이 최소 하나 이상 포함되어 있습니다.


입출력 예



입출력 예 설명



문제풀이

function solution(s) {
    let count = 0; //이진변환횟수를 카운트
    let remove =0; //0이 제거된 개수를 카운트
    while(s !== "1"){
    //s가 "1"이 될 때까지 무한 실행
        count++;
        let result = ""; // s에서 0이 제거되고, 1만 남은 문자열
        for(let i =0; i < s.length; i++){
            if(s[i] === "0"){
                //"0"이라면 s에서 제거(=result 문자열에 담아두지 않는다.)
                remove++;    
                continue; 
            }
             // "1" 이라면 s에 추가(=result 문자열에 담아준다.)
            result += s[i] // "1"
        }
        s = result.length; //"0"이 제거된 문자열의 길이
        s = s.toString(2); // 남은 문자열을 2진법으로 변환
    }
    return [count, remove];
}


메소드 활용

function solution(s) {
    let [count, remove] = [0,0];
    function recursion(){
        if(s === "1"){
            return [count, remove];
        }
        count++;
        s = s.split("").filter( n => {
            if(n === "0") remove++;
            return n === "1"
        }).length;
        // console.log(s)
        s = s.toString(2);
        return recursion();
    }
    return recursion()
}
function solution(s) {
    let [count, remove] = [0,0];
    function recursion(s){
        if(s === "1"){
            return [count, remove];
        }
        count++;
        s = s.split("").filter( n => {
            if(n === "0") remove++;
            return n === "1"
        }).length;
        s = s.toString(2);
        return recursion(s);
    }
    return recursion(s)
    // console.log(s) 
}

실무에선 위와 같은 방법을 사용

profile
JUST DO WHATEVER

0개의 댓글