알고리즘/프로그래머스 - JS

[프로그래머스-JS] level.1 [1차] 비밀지도 ★ <비트연산>

개발자성장기 2022. 7. 23. 14:12
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/17681

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

카카오 해설을 보니 비트 연산을 잘 다룰 수 있는지 묻고자 하는 문제라고 되어있다. 

물론 if else도 정답으로 간주되지만 출제자의 의도는 비트 연산자 사용이다. 

https://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/

 

카카오 신입 공채 1차 코딩 테스트 문제 해설

‘블라인드’ 전형으로 실시되어 시작부터 엄청난 화제를 몰고 온 카카오 개발 신입 공채. 그 첫 번째 관문인 1차 코딩 테스트가 지난 9월 16일(토) 오후 2시부터 7시까지 장장 5시간 동안 온라인

tech.kakao.com

 

 

 

 

나의 풀이

 

function solution(n, arr1, arr2) {
    let decode = []
    let arr1Box = []

   for(i=0; i<n; i++){
      while(arr1[i] > 0 || arr2[i] >0){
           if(arr1[i] % 2 === 0 && arr2[i] % 2 === 0){
               arr1[i] = arr1[i] / 2
               arr2[i] = arr2[i] / 2
               arr1Box.unshift(" ")          
           }else{
               arr1[i] = Math.floor(arr1[i] / 2) 
               arr2[i] = Math.floor(arr2[i] / 2)
               arr1Box.unshift("#")
           }
       }
       while(arr1Box.length < n) arr1Box.unshift(" ");
       decode.push([...arr1Box].join(""));
       arr1Box = []
   } 
    return decode;
}

 

 

결국 비밀지도만 알면되기에  for문으로 두 개의 배열을 같이 계산해줬다. 

둘다 나머지가 0일때만 공백으로 해주고 그 외에 모든 경우에 벽("#")을 세워줬다.

 

그리고  1같은 경우 2진법도 1이기에  자리수가 부족하다 따라서 앞 부분은 전부 공백으로 채워주는 while도 추가하였다.

 

 

 

다른 사람 풀이  1)

 

 

나와 방법은 비슷한데 더 쉽고 가독성 좋게 풀었다.

function solution(n, arr1, arr2) {
    let num1, num2, s;
    let answer = [];
    for (let i=0; i<n; i++){
        num1 = arr1[i];
        num2 = arr2[i];
        s = '';
        for (let j=0; j<n; j++){
            s = (num1%2 + num2%2) ? '#'+s : ' '+s;
            num1 = Math.floor(num1/2);
            num2 = Math.floor(num2/2);
        }
        answer.push(s);
    }    
    return answer;
}

 

 

 

나는 if절로 구분을해서  배열안에 unshift를 했는데  이분은  s = (num1%2 + num2%2) ? "#" + s : " "+s;로  변수 s안에 계속 추가해줬다.

 

이렇게 하면 나중에 배열의 길이가 부족해서 공백을 채워주는 작업을 따로 해주지 않아도 된다. \

어차피 안쪽 for배열은  n까지 반복을 하기에  배열의 길이는 항상 일정하고 

공백을 채워줘야하는 곳에는  계속 나머지가 0이기에  " " + s가 되어서 앞쪽에 공백이 계속 채워지는 원리이다. 

 

내가 푼 방식보다 이 방식이 더 좋은 것같다.  읽기에도  걸리는 시간도 

 

 

 

다른 사람 풀이 2)

 

이렇게 풀어야 카카오의 출제의도에 부합하다

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;
}

 

 

 

addZero 함수에 n과 v | arr2[i] 를 계산한뒤 2진법으로 바꾸고  그 이진 법으로된 값으로 replace를 실행시켰다.

replace 에서는 1 또는 0 을 전역 검색해서 찾으면  0이아니면 "#"  0이면 " " 공백으로 대체되도록하였다.

 

여기서 addZero 함수는 배열길이가 짧은 곳에 앞쪽에 0을 추가해준다 그럼 자동으로 공백이 앞쪽에 추가된다.

 

 

 

반응형