[ 프로그래머스 | Lv.1 ] 비밀지도

angie·2022년 12월 12일
0
post-thumbnail
post-custom-banner

🎯 문제

문제 설명

  • 지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 "공백"(" ") 또는 "벽"("#") 두 종류로 이루어져 있다.
  • 전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 "지도 1"과 "지도 2"라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다. 지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다.
  • "지도 1"과 "지도 2"는 각각 정수 배열로 암호화되어 있다.
  • 암호화된 배열은 지도의 각 가로줄에서 벽 부분을 1, 공백 부분을 0으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다.

입력형식

입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.

  • 1 ≦ n ≦ 16
  • arr1, arr2는 길이 n인 정수 배열로 주어진다.
  • 정수 배열의 각 원소 x를 이진수로 변환했을 때의 길이는 n 이하이다. 즉, 0 ≦ x ≦ 2n - 1을 만족한다.

출력형식

  • 원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.

🧠 풀이 방법

정직한 풀이
각 배열의 숫자들을 2진수로 바꾸고, 각 자릿수를 비교하여 새로운 문자열로 변환했다.

🔠 내 풀이

function solution(n, arr1, arr2) {
  function decToBin(num) {
    num = num.toString(2)
    if (num.length < n) {
      num = '0'.repeat(n - num.length) + num
    }
    return num
  }
  arr1 = arr1.map(decToBin)
  arr2 = arr2.map(decToBin)

  let answer = []
  for (let i = 0; i < n; i++) {
    let el = ''
    for (let j = 0; j < n; j++) {
      if (arr1[i][j] == '1' || arr2[i][j] == '1') el += '1'
      else el += '0'
    }
    answer.push(el)
  }
  answer = answer.map((el) => {
    let newEl = ''
    for (let i = 0; i < n; i++) {
      if (el[i] == '1') newEl += '#'
      else newEl += ' '
    }
    return newEl
  })
  return answer
}

💡 모범 풀이

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;
}
var solution=(n,a,b)=>a.map((a,i)=>(a|b[i]).toString(2).padStart(n,0).replace(/0/g,' ').replace(/1/g,'#'))

두 풀이 모두 비트연산자와 'padStart', 그리고 정규표현식을 활용한 replace 메서드를 사용했다.

비트연산자

따로 포스팅

정규표현식

따로 포스팅

profile
better than more
post-custom-banner

0개의 댓글