[Lv1] 비밀지도

Creating the dots·2022년 1월 7일
0

Algorithm

목록 보기
45/65

프로그래머스

나의 풀이

수도코드

  • 배열의 값을 2진법 수로 바꿔 새로운 배열(map1, map2)에 저장한다.
  • 2진법 수가 n자리가 되도록 한다.
  • n번째까지 이중반복문을 돌며 n자리의 '#' 또는 ' '로 이루어진 문자열을 요소로 갖는 새로운 배열(answer)을 만든다.
    • i번째 값이 둘 중 하나라도 j번째 인덱스가 '1'이라면 '#'
    • 둘 다 '1'이 아니라면 ' '
  • answer을 리턴한다.
function solution(n, arr1, arr2){
  //2진법으로 해독하는 함수
  const binary = (n, arr) => {
    const res = [];
    for(let i=0; i<n; i++){
      let val = arr[i].toString(2);
      if(val.length !== n){
        val = '0'.repeat(n-val.length) + val;
      }
      res.push(val);
    }
    return res;
  }
  const map1 = binary(n, arr1);
  const map2 = binary(n, arr2);
  
  const answer = [];
  for(let i=0; i<n; i++){
    let code = '';
    for(let j=0; j<n; j++){
      if(map1[i][j] === '1' || map2[i][j]=== '1'){
        code += "#";
      }else{
        code += " ";
      }
    }
    answer.push(code);
  }
  return answer;
}

다른 분의 풀이(1)

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

새롭게 배운 내용

padStart

String.prototype.padStart(목표문자열길이 [, 채워넣을 문자열])
문자열의 시작점부터 문자열을 채워넣어 목표한 문자열의 길이로 만들어 리턴한다. 채워넣을 문자열이 없다면, 기본값은 ""이다.

const str = 'hello';
str.padStart(10); // "     hello"

Bitwise OR(|) 💫

피연산자는 32비트 정수로 변환되고 일련의 비트(0 또는 1)로 표시된다. 32비트를 초과하는 숫자는 최상위 비트를 버린다.

//Before:
11100110111110100000000000000110000000000001
//After:
10100000000000000110000000000001

두 개의 숫자를 입력받았을때 각 숫자를 32비트 정수로 전환한 후, 두 숫자의 각 비트가 페어를 이루어, 두 값 중 하나라도 0이라면 1을 리턴한다. 둘 다 0인 경우에만 0을 리턴한다.

/*다음 예시에서 마지막 4자리를 볼때, 
1과 0일땐 1을 리턴해 마지막 자리가 모두 1로 변경되었음을 알 수 있다. 
*/
// 9  
00000000000000000000000000001001
// 14 
00000000000000000000000000001110
14 | 9;
// 15 
00000000000000000000000000001111

다른 분의 풀이(2)

  • 나는 for 반복문을 써서 2진법으로 변경했는데, 이 풀이에서는 map 메소드를 사용해서 간단하고 짧게 작성했다.
  • add 함수를 만들어 문자열을 n만큼의 길이로 만들고, 삼항연산자를 사용해 각 문자열의 i번째 값을 확인해 '#'과 ' '를 리턴한다.
function solution(n, arr1, arr2){
  var answer = [];
  var map1 = arr1.map((v) => (v.toString(2)));
  var map2 = arr2.map((v) => (v.toString(2)));
  for(var i=0; i<n; i++){
    var num = add(map1[i], map2[i], n);
    answer.push(num);
  }
  return answer;
}

function add(str1, str2, len){
  var val1 = "0".repeat(len-str1.length) + str1;
  var val2 = "0".repeat(len-str2.length) + str2;
  var res = "";
  for(var i=0; i<len; i++){
    res += (val1[i]==="1" || val2[i]==="1") ? "#" : " "
  }
  return res;
}

다른 분의 풀이를 보며 공부가 많이 됐다. Bitwise OR 연산자를 알고나니, 문제에서 지도 1 또는 지도 2 중 어느 하나라도 벽(1)인 부분은 전체 지도에서도 벽(1)이다. 지도 1과 지도 2에서 모두 공백(0)인 부분은 전체 지도에서도 공백(0)이다. 라는 부분이 Bitwise OR 연산자를 풀어서 설명한 것이라는 걸 알게됐다.

그리고, 그동안은 반복할때, repeat 메소드만 사용했는데, padStart라는 새로운 메소드도 알게되었다.

정해진 시간안에 문제를 풀다보니 해결자체에만 집중하게 되는데, 다른 분들의 풀이를 보면서 문제 해결 뿐만 아니라 어떻게 '잘' 해결할 수 있는지도 놓치지 말아야겠다는 생각이 든다.

reference

profile
어제보다 나은 오늘을 만드는 중

0개의 댓글