[프로그래머스]Algorithm_23.04.24

윤성해·2023년 4월 24일
0

알고리즘

목록 보기
22/22
post-thumbnail

3진법 뒤집기

레퍼런스

1.while

function solution(n) {
    let answer = "";
    
    while(n > 0){
        answer += (n%4)
        console.log(answer, n)
        n = Math.floor(n / 4)
    }
    console.log(answer)
}

2.toString, parseInt

function solution(n) {
    let answer = "";
    
//     while(n > 0){
//         answer += (n%4)
//         console.log(answer, n)
//         n = Math.floor(n / 4)
//     }
    
    answer = n.toString(3);
    
    let reverse = " ";
    for ( let i = answer.length - 1; i >= 0; i-- ) {
        // console.log(answer, answer[i])
        reverse += answer[i];
    }
    
    return parseInt(reverse, 3)
}

3. 메서드 split, reverse, join

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

추가설명

toString은 바로 숫자 뒤에 올 수 없고 변수에 담아서 사용해야 하는데, 그냥 숫자에다가 사용할 수 있는 방법은 !
10을 소괄호로 묶어서 그룹화 해주기.

(10).toString


그리고 3..toString 해도 되는데 이유는 3. 이 3.0 이랑 같아서 된다.
소수점도 .5.toString() 하면 된다. 1. 그룹화, 2. 소수점특성사용


내가 바꾼 3진법을 10진법으로 바꾸려고 이렇게 하고싶어서 이렇게 작성했는데, 안된다. 이거 진짜 바꿔준게 아니고 표현만 바꿔주었다.
parseInt 는 내가 설정한 진법을 다시 10진법으로 바꿔준다.

1인자 바꿔줄 문자열, 2인자 어떤진법으로 이루어있었는지를 넣어준다.
3진법으로 바꿔주었으면, 3을 써주어야 한다. 두개가 다르면 안됨!!


이진 변환 반복하기


문자열 1이 될때까지 반복하고, 첫번째 인자는 번수, 두번째는 0을 제거한 갯수

레퍼런스

1.while - 반복문의 끝을 설정할 수 없을때!

function solution(s) {
    let count = 0; // 이진 변환 횟수를 카운트
    let remove = 0; // 0이 제거된 개수를 카운트
    
   while (s !== '1'){
       // s가 문자열 1이 아니라면 무한히 실행. 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진법으로 변환
       console.log(s, count, remove)
   }
    return [count, remove];
}

2. recursion()함수
우리가 사용하는 배열 반복문은 길이가 정해져있다. map도 배열 길이 만큼만 반복. 그렇다면? recursion()함수를 사용해보자!
내가 만든 함수를, 내가 종료가 됨과 동시에 다른 함수를 호출한다.

5초과 안되면 로직 찍힌다. 안녕하ㅔ요 찍히고 카운트 하나 찍히고.
리커젼 return 될 때, 그 결과로 나자신을 다시 호출한다! 그러면 안쪽 로직이 한바퀴 더 돌게된다. 자기자신을 호출(실행)하는 함수 -> 재귀함수 . while문과 유사하다! 조건문제 나왔을 때 완전히 종료시킬 수 있는 함수.

활용해서 문제 풀어보기!

function solution(s) {
    // let count = 0; // 이진 변환 횟수를 카운트
    // let remove = 0; // 0이 제거된 개수를 카운트
    let [count, remove] = [0,0] // 비구조할당! 변수명과 데이터가 서로 결합
    
    function recursion(s) { // 리커젼은 함수명이라 aaa 사용해도 된다. 여기에 s 넣어야 함수 안쪽으로만 s 영향이 끼친다. 안그러면 솔루션의 s가 영향을 받을 수 있다. 결과가 달라짐!
        console.log(s, count, remove)
        if (s === "1"){
            return [count,remove]; //s가 "1" 되는 순간 종료된다.
        }
        count++;
        
        s = s.split("").filter( num => {
            if (num === "0") remove++; // 0이면 리무브 늘려주고 
            return num === "1" // 1이면 리턴
        }).length;
        s = s.toString(2);
        
         return recursion()
    }
  return recursion()
}
profile
Slow and steady wins the race.

0개의 댓글