IT/Algorithm

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

프티 2021. 7. 5. 23:09
반응형

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

 

코딩테스트 연습 - [1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

programmers.co.kr

 

풀이

arr1과 arr2 두 배열을 각각 2로 계속 나누어 나머지가 1이면 1, 없다면 0을 새로운 배열에 집어넣었다.

 

그렇게 2진수로 변환하여 for문을 돌려 각 자리마다 2진수를 더했고 1 이상인 경우 #을,

0이라면 공백을 집어넣었다.

 

마지막으로 join('')을 사용하여 배열을 문자열로 변환하였다. ㅠㅠ

2진수로 변환하는 과정을 간소화할 방법이 떠오르지 않아 복잡 ~~~ 하게 작성했다..

function solution(n, arr1, arr2) {
    var answer = [];

    for(let i=0; i<n; i++){
        var ar1 = [];
        var ar2 = [];

        while(true){
            arr1[i]%2 === 1 ? ar1.push(1):ar1.push(0);
            arr1[i] = Math.floor(arr1[i]/2);
            if(arr1[i] === 0){
                if(ar1.length !== n){
                    while(ar1.length < n){
                        ar1.push(0);
                    }
                    break;
                }
            }
        }
        while(true){
            arr2[i]%2 === 1 ? ar2.push(1):ar2.push(0);
            arr2[i] = Math.floor(arr2[i]/2);
            if(arr2[i] === 0){
                if(ar2.length !== n){
                    while(ar2.length < n){
                        ar2.push(0);
                    }
                    break;
                }
            }
        }

        var list = [];

        for(let i=0; i<n; i++){
            list.push((ar1[i]+ar2[i]) >= 1 ? '#':' ');
        }

        answer.push(list.reverse().join(''));
    }

    return answer;
}

 

다른 사람 풀이

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

a(문제의 arr1에 해당) 배열을 맵핑하여 값과 인덱스를 가져왔다.

인덱스는 또 다른 배열 b(문제의 arr2에 해당)의 원소를 불러오기 위함이다.

 

그리고 비트 연산자!! 를 활용하여 특별한 변환 없이 a와 b[i]를 2진수의 비트 단위로 계산하였고(a|b[i] 그냥 덧셈이 아닌!),

그것을 toString()을 활용하여 2진수로 표현하였다.

 

그저 문자열로 변환시켜주는 메소드인줄 알았는데 이런 기능이 있었다!

앞에 number냐 object냐에 따라 쓰임새가 아예 달라진다.

 

 

a|b -> 비트 연산자(비트 단위 논리합) : 두 피연산자의 각 자리 비트의 값이 둘 다 0일 경우 해당하는 자리에 0을 반환

비트연산자. 2진법으로 연산을 수행한다.
각 비트 연산자 설명

 

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

사진 자료가 길어 코드가 보이지 않으므로 다시 볼러 왔다.

 

변환된 2진수를 주어진 지도의 크기 n만큼 0으로 채워준다.

2진수의 공간이 비는 경우는 큰 자릿수 즉, 문자열의 앞부분이 되므로 문제없음!

그리고 정규표현식을 활용한 replace 메소드를 사용하여 0은 공백,

1은 #으로 바꿔주었다.

 

이 모든 게 한 줄로 끝나다니!!

문제를 풀고 기뻤으나 이 코드를 보고 큰 현타가 왔다..

 

하지만 코드를 이해했으니 다음부턴 나도 저렇게 간결한 코드를 작성할 수 있을 거라 기대해본다 ㅠㅠ!

반응형