본문 바로가기

알고리즘구현능력/문제해결능력

[javascript] 1차 비밀지도

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//비밀지도 
//지도는 한 변의 길이가 n이다. 
//각 칸은 공백(" ")이나 "#"으로 이루어져 있다.
//전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 
//둘 개의 지도중에 하나의 지도만 벽이라도 벽으로 된다. 둘다 공백인 부분은 공백이다.
//지도 1과 지도 2는 정수 배열로 암호화 되어 있다. 0과1로 되어있다.
//암호화된 배열은 짇의 각 가로줄에서 벽부분을 1, 공백 부분을 0 으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다.
function solution(n, arr1, arr2) {
    var answer = [];
    let arr1_2 = arr1.map(element => element.toString(2)); //지도1를 2진수로 변환한다.
    let arr2_2 = arr2.map(element => element.toString(2)); //지도2를 2진수로 변환한다.
    let long = n; //가장 긴길이를 담을 그릇
    
    for(let i=0;i<arr1_2.length;i++){ //길이를 맞춰준다.
        if(long>arr2_2[i].length){
            arr2_2[i] = Array(long-arr2_2[i].length).fill("0").join("")+arr2_2[i];
        }
        if(long>arr1_2[i].length){
            arr1_2[i] = Array(long-arr1_2[i].length).fill("0").join("")+arr1_2[i];
        }
    }
    
    for(let i=0;i<arr1_2.length;i++){ 
        let word = "";
        for(let j=0;j<arr1_2[i].length;j++){
            if(arr1_2[i][j]==="1"||arr2_2[i][j]==="1"){
                word+="#";
            }
            else{
                word+=" ";
            }
        }
        answer.push(word);
    }
    
    return answer;
}
cs

 

간단한코드

1
2
3
4
5
6
7
8
9
function solution(n, arr1, arr2) {
    //toString(2) 2진수로 바꾼다.
    //replace(/1|0/g,element => +element ? "#" : " ") 1이면 "#"으로 아니면 " " 더한다.
   return arr1.map((value,index)=>length_same(n,(value|arr2[index]).toString(2)).replace(/1|0/g,element => +element ? "#" : " "));
 
function length_same(n,word){
    return "0".repeat(n-word.length)+word; //길이를 맞춰주는 함수,,
}
cs

알게된것 

NUM.toString(n) NUM을 n진수로 바꾼다.

정규표현식의 x|y를 사용하는법

replace(/x|y/g,element => +element ? "#" : " " 모든 문자열에 대해서 x이면 #으로 바꾸고 y이면 " "으로 바꾼다.