[프로그래머스 lev1/JS] 비밀지도

woolee의 기록보관소·2022년 11월 8일
0

알고리즘 문제풀이

목록 보기
55/178

문제 출처

프로그래머스 lev1 - 비밀지도

문제

나의 풀이

자릿수만큼 앞자리 0으로 채우는 방법
arr1[i]=Array.from({length:n-arr1[i].length}, () => 0).join('')+arr1[i];

function solution(n, arr1, arr2) {

  function strChange(a) {
    for (let i=0; i<a.length; i++) {
      a[i]=a[i].toString(2);
      if (a[i].length < n) {
        a[i]=Array.from({length:n-a[i].length}, () => 0).join('')+a[i];
      }
    }
  } 
  
  strChange(arr1);
  strChange(arr2);

  let answer = new Array(n).fill('');

  for (let i=0; i<arr1.length; i++) {
    for (let j=0; j<arr1.length; j++) {
      if (arr1[i][j] === '1' || arr2[i][j] === '1') {
        answer[i] += '#';
      }
      else {
        answer[i] += ' ';
      }
    }
  }
  return answer; 
}

console.log(solution(5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28]));

다른 풀이

압축 방법 map( (a,i) => (a | b[i]))

var solution=(n,a,b)=>a.map((a,i)=>(a|b[i]).toString(2).padStart(n,0).replace(/0/g,' ').replace(/1/g,'#'))

/1|0/g 1혹은 0

function solution(n, arr1, arr2) {
    return arr1.map((v, i) => addZero(n, (v | arr2[i]).toString(2)).replace(/1|0/g, a => +a ? '#' : ' '));
}

const addZero = (n, s) => {
    return '0'.repeat(n - s.length) + s;
}

내장함수를 사용하지 않고 수동으로 2진수로 변환.
둘 중 하나라도 1이라는 건, 둘을 더해서 1보다 크면 ‘#’ 아니면 ‘ ‘라는 의미니까

function solution(n, arr1, arr2) {
    let num1, num2, s;
    let answer = [];
    //manually turning decimals to binaries cos i can!
    for (let i=0; i<n; i++){
        num1 = arr1[i];
        num2 = arr2[i];
        s = '';
        for (let j=0; j<n; j++){
            s = (num1%2 + num2%2) ? '#'+s : ' '+s;
            num1 = Math.floor(num1/2);
            num2 = Math.floor(num2/2);
        }
        answer.push(s);
    }    
    return answer;
}
profile
https://medium.com/@wooleejaan

0개의 댓글