n진법 바꾸기, 비트연산자, some()의 활용

게코젤리·2022년 12월 20일
0

프로그래머스 문제 풀이 - [1차]비밀지도 풀이(LV1)

https://school.programmers.co.kr/learn/courses/30/lessons/17681?language=javascript

  1. 주어진 두 배열을 조합해 지도(문자)가 담긴 배열을 반환하는 문제다. 숫자를 n진법으로 변환하는 방법에 대해 알아보았고, 코드 작성시 기능별로 함수를 분리하여 가독성과 재사용성을 높이는 것에 초점을 맞췄다.
  2. 이진법 숫자의 논리 연산시 활용할 수 있는 비트연산자와 every, some 매서드에 대해서 알아보았다.

처음 작성한 코드

function returnBinary(number, numlength) {
  let str = "";

  // 이진법 (거꾸로) 구하기
  while (true) {
    str += (number % 2) + "";

    if (number >= 2) {
      number = Math.floor(number / 2);
    } else {
      break;
    }
  }
  console.log('str', str);
  
  // 빈자리에 0 채워넣기
  for (let i = str.length; i < numlength; i++) {
    str += "0"
  }

  // 거꾸로 돌리기
  let result = "";

  for (let i = str.length - 1; i >= 0; i--) {
    result += str[i];
  }

  return result;
}

function solution(n, arr1, arr2) {
  for (let i = 0; i < n; i++) {
    arr1[i] = returnBinary(arr1[i], n);
    arr2[i] = returnBinary(arr2[i], n);
  }

  combinedArr = [];
  
  for (let i = 0; i < n; i++) {
    let str = "";

    for (let j = 0; j < n; j++) {
      if(arr1[i][j] === "1" || arr2[i][j] === "1"){
        str += "#";
      } else {
        str += " ";
      }
    }

    combinedArr[i] = str;
  }

  return combinedArr;
}

함수 분리

  • 메인 함수는 실제 기능을 하는 다른 함수들을 담고 있는 지도의 역할(만).
  • 하나의 함수는 한 가지의 일만 할 수 있도록.
// n진법으로 바꾸기
function toRadix(n, radix) {
  let result = "";

  while (n > 0) {
    result = (n % radix) + result;
    n = Math.floor(n / radix);
  }

  return result;
}

// 암호숫자로 바꾸기
function toCipher(arr, numlength) {
  for (let i = 0; i < arr.length; i++) {
    arr[i] = toRadix(arr[i], 2);
    arr[i] = arr[i].padStart(numlength, "0");
  }

  return arr;
}

// 지도 만들기
function createMap(arr1, arr2){
  const result = [];
  for (let i = 0; i < arr1.length; i++) {
    let str = "";

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

    result[i] = str;
  }

  return result;
}

function solution(n, arr1, arr2) {
  const cipher1 = toCipher(arr1, n);
  const cipher2 = toCipher(arr2, n);

  return createMap(cipher1, cipher2);
}

some() 활용

  • 배열의 모든 요소를 하나씩 입력한 조건(함수)에 부합하는 지 판별.
  • boolean을 반환
  • some(): 하나라도 true면 true, 빈배열은 false
  • every(): 하나라도 false면 false

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/some

function createMap(arr1, arr2) {
  const result = [];
  for (let i = 0; i < arr1.length; i++) {
    let str = "";

    for (let j = 0; j < arr1[i].length; j++) {
      const compare = [arr1[i][j], arr2[i][j]];
      if (compare.some((x) => x === "1")) {
        str += "#";
      } else {
        str += " ";
      }
    }

    result[i] = str;
  }

  return result;
}

비트연산자

  • | : 하나라도 1이면 1을, 아니면 0을 반환함.
  • & : 모두 1이면 1을, 아니면 0을 반환함.
function createMap(arr1, arr2) {
  const result = [];
  for (let i = 0; i < arr1.length; i++) {
    let str = "";

    for (let j = 0; j < arr1[i].length; j++) {
      const compare = arr1[i][j] | arr2[i][j];
      const mark = compare ? "#" : " ";
      str += mark;
    }

    result[i] = str;
  }

  return result;
}

사실! 10진수 숫자를 비트연산자로 비교해도 알아서 2진수로 바꿔서 각 자리마다 연산해준다.

내가 한 방법 :
1. 9와 30을 각각 2진수 문자열로 바꾼다. '1001', '11110'
2. '0'을 추가해서 자리수를 맞춰줌. '01001', '11110'
3. 각 자리수마다 비교하여 새 문자열 생성. '11111'

비트연산자를 활용한 간단한 방법:
1. (9 | 30) // 31
2. 2진수로 바꿔줌 // '11111'

다음에 비슷한 문제가 나오면 활용해보자.

0개의 댓글