프로그래머스 문제 분석


2018년 카카오 블라인드 테스트 1차 비밀지도 문제(문제 번호 17681). 파라미터는 arr1 arr2 n 이렇게 3개를 받으며, n은 한 변의 길이를 나타낸다(배열 각 요소를 이진수로 변환한 후의 length).

  1. 2개의 배열을 받아

    [9, 20, 28, 18, 11] // arr1
    [30, 1, 21, 17, 28] // arr2
    
  2. 배열의 각 요소를 2진수로 변환한 뒤 (10진수 → 2진수 변환은 노트 참고)

    ['01001', '10100', '11100', '10010', '01011'] // arr1
    ['11110', '00001', '10101', '10001', '11100'] // arr2
    
  3. 0' ' 공백, 1# 으로 변환

    [' #  #', '# #  ', '###  ', '#  # ', ' # ##'] // arr1
    ['#### ', '    #', '# # #', '#   #', '###  '] // arr2
    
  4. 각 배열 병합. arr1[i][j]arr2[i][j]를 비교할 때 둘 중 하나라도 #이면 그대로 # 사용

    // arr1, arr2 첫번째 요소 비교
    ' #  #'
    '#### '
    -------
    '#####'
    
     ["#####","# # #", "### #", "# ##", "#####"]
    
  5. 해결 방식을 그림으로 표현하면 아래와 같다

    Untitled

내가 푼 방식


map reduce를 이용해서 원시적으로 풀었다.

  1. 배열 각 요소를 2진수로 변환

    const convertToBinary= arr => {
      return arr.reduce((acc, cur) => {
        let converted = cur.toString(2);
        converted = '0'.repeat(n - converted.length) + converted;
        return acc.concat(converted);
      }, []);
    };
    
    const map1 = convertToBinary(arr1); 
    const map2 = convertToBinary(arr2);
    

    일부 숫자는 이진수 변환 후의 lengthn보다 작기 때문에 repeat() 메서드로 자릿수를 맞춰준다.

    // length(자릿수)가 맞지 않기 때문에 두 이진수를 비교하기 애매하다
    '1001' // 숫자 9 이진수(arr1[0][0])
    '11110' // 숫자 30 이진수(arr2[0][0])
    
    // repeat 메서드를 사용해 숫자 9 이진수의 부족한 자릿수만큼 '0' 추가
    // n은 5라고 가정
    '0'.repeat(n - '1001'.length) + '1001' // '01001'
    
  2. 0' ' 공백, 1# 으로 변환 — 이 부분은 OR 비트 연산자로 깔끔하게 풀 수 있다

    return map1.map((el, i1) =>
      el
        .split('')
        .reduce(
          (acc, cur, i2) =>
            cur === '1' || map2[i1][i2] === '1' ? acc + '#' : acc + ' ',
          '',
        ),
    );
    

레퍼런스 코드 분석


Javascript Basic & Detail

비트 연산자 참고글

비트 연산자

<aside> 💡 비트는 이진(Binary) 숫자만 사용한다. 비트 연산자는 비트 수준에서 변수와 상호 작용하는 방법이다. 비트 수준에서의 평가는 일반 논리연산자보다 속도가 빠르다.

</aside>

좋아요를 가장 많이 받은 다른 사람 코드를 보니 정말 깔끔하다. v | arr2[i] 요 코드는 단순히 OR 연산자를 사용한지 알았는데 자세히 보니 Vertical Bar |가 하나밖에 없다. 찾아보니 비트연산자의 OR이다.