ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 비밀지도
    너의말이보여네약점algorithm 2022. 4. 5. 15:14

    1트

    // # psudo
    //    지도 1 array item을 이진수로 치환하는 방법?-> 0은 공백, 1은 #으로 치환.
    //    지도 2 array item을 이진수로 치환?-> 0은 공백, 1은 #으로 치환
    //    합집합처럼 지도 1과 지도 2를 더한다 ~ 배열을 합치는 메서드? 배열 두개를 더해야?
    
    function solution(n, arr1, arr2) {
       const convertToBinary = (arrName)=> {
            return arrName.map(i=>i.toString(2).padStart(n,'0'))
        }
       
    const binaryArr1 = convertToBinary(arr1)
    const binaryArr2 = convertToBinary(arr2)
    
    //문자열이어서 비트연산이 안되는 줄 알았는데 자릿수때문에 안되는거였다! (이게틀린듯...?)
    //그럼 앞에다가 0을 추가해줘서 자릿수를 맞춰주면 될텐데...
    //자바스크립트 자릿수 맞추기 검색 => .padStart
    //실험~
    
    console.log(binaryArr1) // [ '01001', '10100', '11100', '10010', '01011' ]
    console.log(binaryArr2) // [ '11110', '00001', '10101', '10001', '11100' ]
    
        //여기서 for문으로 구현해봤는데 안되는것임..그래서 다 찍어봄
        console.log(binaryArr1[0] | binaryArr2[0]) // 11247 ?????
        console.log(binaryArr1[1] | binaryArr2[1]) // 10101
        console.log(binaryArr1[2] | binaryArr2[2]) // 12157 ?????
        console.log(binaryArr1[3] | binaryArr2[3]) // 10011
        console.log(binaryArr1[4] | binaryArr2[4]) // 11263 ?????
    
     // # 질문 ?????한 부분은 이진수 OR 연산이 왜 안되나요...?
        
     //-> 순서가 틀렸음다 저 toString으로 이진수로 변환한 이상 item의 타입은 number가 아니라 string이기 때문에 
    // OR 비트 연산이 먹지 않았던 것 ~
    // 근데 인덱스 1과 3은 왜된거임.. 이건궁금.. ㅠ
    
    // 그렇다면 or 연산자의 피연산자는 반드시 number 타입 이어야하는지? no~ boolean 가능~
       
    // (됐다고 가정하면 arr1과 2의 합집합스러운 (...) 하나의 배열이 만들어짐)
    // 그 배열의 이름을 unionArr라고 가정
    // 검색 문자열을 특정 문자열로 변환 -> https://powerku.tistory.com/130
    // map으로 replace를 해주면되지않을까?
    // string.replace(0, "")
    // string.replace(1,"#")
    
    // return unionArr.map(i=>i.replace('0',"").replace('1',"#")
    }

     

    중간과정

    2진수로 바꿔주는 연산을 해주는 convertToBinary라는 함수를 만들었는데 어차피 리턴되는 배열이 하나니까 굳이 함수로 만들 필요가 없다고 생각해서 최종 풀이를 수정했다~

    function solution(n, arr1, arr2) {
     let unionArr = Array.from(arr1, (v,i)=> v | arr2[i])
    
        function convertToBinary (arrName) {
           return arrName.map(i=>i.toString(2).padStart(n,'0'))
        }
    const unionBinary = convertToBinary(unionArr)
        const answer = unionBinary[1].replace(/0/g,'#').replace(/1/g," ")
        console.log(answer)
    }

    풀이

    function solution(n, arr1, arr2) {
    const unionArr = Array.from(arr1, (v,i)=> v | arr2[i])
    
        const answer = unionArr.map(i=>i.toString(2)
        					   .padStart(n,'0')
        					   .replace(/1/g,"#")
        					   .replace(/0/g, " "))
        
        return answer

    얕복을 해서 arr1의 불변성을 지키고 싶은 마음이 Array.from에서 드러난다...

     


    디스캣님의 풀이

    이번엔 함수형스럽게 output부터 구현해서 행복코딩하신듯하다

    콘솔로 찍기도 쉽다고 해서 이렇게 구현하는 방법도 익히면 재미있을듯~

    function solution(n, arr1, arr2) {
        const render = x =>        //뭔진 몰라도 숫자 오면 원하는대로 그릴것
            (x)                    //'뭔진 몰라도'의 그것
            .toString(2)           //이진수가 되어라
            .padStart(n,'0')       //빵꾸를 메꿔라
            .replace(/1/g,'#')     //1 바꾸기
            .replace(/0/g,' ')     //0 바꾸기 (요구사항이 바뀐다면 아래에 확장가능)
        
        return arr1
            .map((x,i)=>x|arr2[i]) //합치고 
            .map(render)           //그리고
    }

     


    개인적으로 좋았던 람쥐님 풀이

    function binaryNum(n, arr1, arr2) {
      const expectedArr = [];
      arr1.forEach((ele, i) => {
        let sum = Number(ele.toString(2)) + Number(arr2[i].toString(2)) + '';
        expectedArr.push(
          ' '.repeat(n - sum.length) + sum.replace(/[1-9]/g, '#').replace(/[0]/g, ' '),
        );
      });
    
      return expectedArr;
    }

     

    타입이 string일때 OR비트 연산을 돌리면 1이 아닌 1-9의 범위의 값이 나왔다. 그런데 나는 여기서 number타입일 때 처음으로 돌아가서 OR 비트연산을 하는 순서로 바꿨는데 람쥐님은 1-9의 범위로 #을 치환하니까 숫자가 꼭 1이 아니어도 문제에서 원하는 대로 치환은 되는 것이다... 타입이 string 일 때 or 비트연산을 한 다음 그 입력값의 범위를 넓혀도 됐던 것임...생각의 범위가 확장되는 느낌이어서 역시 다른 분 풀이를 보면서 배우는 게 많다고 느낀다~ 역시 멋지다~

Designed by Tistory.