-
비밀지도너의말이보여네약점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 비트연산을 한 다음 그 입력값의 범위를 넓혀도 됐던 것임...생각의 범위가 확장되는 느낌이어서 역시 다른 분 풀이를 보면서 배우는 게 많다고 느낀다~ 역시 멋지다~
'너의말이보여네약점algorithm' 카테고리의 다른 글
알고리즘 학습방향 질문 내용 정리 (0) 2022.04.07 부족한 금액 계산하기 (0) 2022.04.06 가운데 글자 가져오기 (0) 2022.04.04 나누어 떨어지는 숫자 배열 (0) 2022.03.31 같은 숫자는 싫어 (0) 2022.03.31