[프로그래머스] [1차]비밀지도


문제풀이

지도는 한 변의 길이가 n인 정사각형 배열 형태
각 칸은 "공백"(" ") 또는 "벽"("#") 두 종류로 이루어져 있다
지도 2장이 주어지는데 암호화 된 배열로 주어지고, 부호화 했을 때 얻어지는 이진수에 해당하는 배열 값이다

  1. arr1 에 대한 해독 된 배열 값을 구하고
  2. arr2 에 대한 해독 된 배열 값을 구한다
  3. 위 값을 구할 함수 getMap 함수를 작성한다
    • toString 내장 메서드를 이용하여 2진수 변환을 해주고 주어진 n의 길이보다 짧게 변환 되었다면 repeat으로 0만큼 앞의 문자열을 채워준다
  4. 이중 for문을 돌면서 구해진 두 배열의 값으로 각 자리의 문자열을 비교해가며 둘 중 한개의 값이 1일 경우 '#' 을 추가하고 아닐경우는 ' ' 공백을 추가해준다.

작성코드

function solution(n, arr1, arr2) {
  const result = [];
  let map1 = getMap(arr1,n)
  let map2 = getMap(arr2,n)

  for(let i=0; i<n; i++){
      // debugger
      result[i] = '';
    for(let j=0; j<n; j++){
      if(map1[i][j] === '1' || map2[i][j] === '1') result[i] += '#'
      else result[i] += ' '
     }
  }
  
  return result
}

function getMap(arr,n){
    
  return arr.map((el) => {
    let val = el.toString(2) // 2진수 변환
    let repeatNum = n-val.length // 구해진 값에서 n길이만큼 되는지 확인 안되면 0으로 앞 채워주기
   return repeatNum !== 0 ? '0'.repeat(repeatNum) + val : val
  })
    
}

놓친부분

배열안의 타입을 지정해 주지 않고 문자열을 추가하게 되면 undifined 가 먼저 들어간다

실행한 결괏값 
["undefined#####","undefined# # #","undefined### #","undefined#  ##","undefined#####"]() 
기댓값 ["#####","# # #","### #","#  ##","#####"]() 다릅니다.

개선하고 싶은 부분

고차함수메서드를 쓰고싶었으나 이중 for문 외에 어떻게 값을 비교할 지 생각을 못했다.
조금 더 빠른 시간복잡도를 위해 개선하고 싶었는데 마땅한 수가 생각이 나지 않아
다른분들의 풀이를 보고 참고해야겠다.

좋은 웹페이지 즐겨찾기