관리 메뉴

Jerry

[프로그래머스] 비밀지도 본문

Problem Solving/Algorithm 문제 풀기

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

juicyjerry 2022. 2. 22. 07:21
반응형
function solution(n, arr1, arr2) {
    var answer = [];
   
    for(let i=0; i<n; i++){
        const bin = (arr1[i] | arr2[i]).toString(2);
        console.log(bin);
           let line = [];
        for(let j = bin.length-n; j<bin.length; j++) { // j가(인덱스값)이 -1일 경우 undefined 반환.
            if(bin[j] === '1') { // 1이면 '#', 그 외 ' '
                line.push('#');
            } else {
                line.push(' ');
            }
        }
        answer.push(line.join(''));
    }
    return answer;
}

 

 

 

 

 

 

나의 문제 접근 방법

  1. 배열에 접근한다
  2. 각 요소(행;여기선 arr1, arr2)에 대한 정수를 이진법으로 변형한다
  3. 각 행렬을 탐색하면서 1일 경우, '#'으로 변경 0일 경우, "" 공백으로 변경
  4. 전체 지도 변수를 만들어 문제의 조건에 따른 #과 ""을 채웠다.
  5. 출력한다

 

 

 

 

 

 

 

코드

function solution(n, arr1, arr2) {
  const tMap = new Array(n);
  for (let i = 0; i < n; i++) {
      tMap[i] = new Array(n).fill("");
  }
  // console.log(tMap);
  
  arr1 = arr1.map((el) => el.toString(2));
  arr2 = arr2.map((el) => el.toString(2));
  // console.log(arr1, arr2);
  
  arr1 = arr1.map((el) => el.toString(2).split(""));
  arr2 = arr2.map((el) => el.toString(2).split(""));
  // console.log(arr1, arr2);
  
  for (let i = 0; i < n; i++) {
      if (arr1[i].length < n) {
          for (let j = 0; j < n - arr1[i].length; j++) {
              arr1[i].unshift('0');
          }
      }
      // console.log(arr1[i]);     
      // console.log(arr2[i].length);
  
      if (arr2[i].length < n) {
          for (let j = 0; j < n - arr2[i].length + 1; j++) {
              // console.log(j);
              arr2[i].unshift('0');
          }
      }
      // console.log(arr2[i]);     
      
      for (let j = 0; j < n; j++) {
          if (arr1[i][j] === "1") arr1[i][j] = "#";
          else if (arr1[i][j] === "0") arr1[i][j] = "";
      }
      
  }

  for (let i = 0; i < n; i++) {
      if (arr2[i].length < n) {
          for (let j = 0; j < n - arr2[i].length; j++) {
              arr2[i].unshift('0');
          }
      }
      // console.log(arr2[i]);     
  
      for (let j = 0; j < n; j++) {
          if (arr2[i][j] === "1") arr2[i][j] = "#";
          else if (arr2[i][j] === "0") arr2[i][j] = "";
      }
      
  }

  // console.log(arr1, arr2);
  
  for (let i = 0; i < n; i++) {
      let temp = "";
      for (let j = 0; j < n; j++) {
          if (arr1[i][j] === "#" || arr2[i][j] === "#") {
              tMap[i][j] = "#";
          } else if (arr1[i][j] === "" && arr2[i][j] === "") {
              tMap[i][j] = "";
          }
      }
      // console.log(tMap[i]);  
          
      for (let j = 0; j < n; j++) {
          if (tMap[i][j] === "") {
              temp += " ";
          } else {
              temp += "#";
          }
      }
      // console.log("temp : ", temp);
      
      tMap[i] = temp;
  }
  // console.log(tMap);  
  return tMap;
}

 

 

 

 

 

 

 

 

결과

테스트 케이스 일부는 통과하지만, 그렇지 못한 케이스가 발생하였다.

 

 

 

 

 

 

 

 

 

다른 문제 풀이 코드 참조

#1

function solution(n, arr1, arr2) {
    var answer = [];
   
    for(let i=0; i<n; i++){
        const bin = (arr1[i] | arr2[i]).toString(2);
        console.log(bin);
           let line = [];
        for(let j = bin.length-n; j<bin.length; j++) { // j가(인덱스값)이 -1일 경우 undefined 반환.
            if(bin[j] === '1') { // 1이면 '#', 그 외 ' '
                line.push('#');
            } else {
                line.push(' ');
            }
        }
        answer.push(line.join(''));
    }
    return answer;
}

 

 

 

 

 

 

 

 

#2

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

 

 

 

 

 

 

 

 

 

(a | arr2[i]) 와 같이 OR 연산으로 처리하는 부분의 동작이 이해가 안 돼, 임의로 콘솔 값을 찍어보았다.

 

 

 

 

 

 

 

 

 

 

아래와 같이 값이 출력되는 것을 확인할 수 있었다.

각 배열을 해당 인덱스 값에 따라 출력되고 있었다.

 

arr1 :  9
arr2 :  30
arr1 :  20
arr2 :  1
arr1 :  28
arr2 :  21
arr1 :  18
arr2 :  17
arr1 :  11
arr2 :  28

 

 

 

 

 

 

 

padStart 메서드에 대해서도 알 수 있었다.

- 주어진 길이를 만족하는 문자열을 반환

 

 

String.prototype.padStart() - JavaScript | MDN

padStart() 메서드는 현재 문자열의 시작을 다른 문자열로 채워, 주어진 길이를 만족하는 새로운 문자열을 반환합니다. 채워넣기는 대상 문자열의 시작(좌측)부터 적용됩니다.

developer.mozilla.org

 

 

 

 

 

 

 

Takeaway

영국에선 포장 음식 (=takeout)으로 쓰이지만 미국에선 (특정 상황에서 꼭 가져가고싶은) 핵심 정보/느낀점

 

 

나름대로 짠 코드가 가독성이 떨어지긴 하지만 처음 설계한 알고리즘대로 논리적인 시도를 해보았다. 그것과는 별개로 같은 알고리즘이더라도 코드를 깊이 있게 짜는 것에 대한 점을 느꼈다.

 

 

OR 연산자를 활용하는 법과 padstart 메서드, toString으로 진법 전환, 정규표현식 등 여러가지 포인트를 배울 수 있는 시간이었다.

 

 

 

 

 

 

 

 

 

 

 

반응형