프로그래머스: 비밀지도

송유나·2021년 1월 22일
0

1. 문제

두 지도를 합쳤을 때 어느 한쪽이 "#"이라면 전체 지도도 "#"이다.
전체 치도를 '#' 와 " "(공백)으로 구성된 문자열 배열로 출력하는 문제


2. 풀이

  1. arr에 담긴 10진수들을 2진수로 변환한다.
  2. 같은 index끼리 비교해서 어느 한쪽이 1이면 "#"반환 그렇지않으면 공백 반환

🌈문제가 어렵진 않다. 하지만 "#"을 반환하는 코드를 어떻게 작성해야 할지 고민을 좀 하는 시간이 필요했다.


3. 생각해봐야 하는 부분

  1. nxn의 지도이기 때문에 10진수👉2진수 했을 때 5자리여야 하지만 1은 2진수로 바꿔도 1이기 때문에 이 부분을 처리해줘야 했음
    🌈나는 for문을 돌려서 뒤에서부터 탐색해서 n만큼 돌려줬음
    🌈다른 사람들은 repeat()padStart()를 사용했다

4. 코드

function solution(n, arr1, arr2) {
    var answer = [];
    var temp = ""
    
    arr1 = arr1.map(d=>d.toString(2))	//2진수로 변환
    arr2 = arr2.map(d=>d.toString(2))
    
    for(var i=0; i<arr1.length; i++){
        for(var j=1; j<=n; j++){
          //arr1[i]와 arr2[i]의 맨 마지막 값부터 탐색
          //어느 하나라도 1이면 "#"반환 그렇지 않으면 공백 반환
            if(arr1[i][arr1[i].length-j] == 1 || arr2[i][arr2[i].length-j] == 1) temp += "#"
            else temp += " ";
        }
      //맨 뒤부터 탐색했기 때문에 뒤집어 주어야 함
        answer.push(temp.split("").reverse().join(""))
        temp = ""
    }
    
    return answer;
}

5. 배운 것

🌈문제가 어렵지는 않았지만 다른 사람의 코드를 보면서 이렇게 간단히 만들 수 있고, 이런 기능들을 사용할 수 있다는 것을 배운 문제이기 때문에 작성해 본다.

  1. 특정 길이만큼 특정 문자열로 채울 때: repeat()padString()을 사용할 수 있다.
  2. 나는 for문을 돌려서 구현했지만 비트연산자: |를 활용할 수 있다.
    몰랐던 덕분에 이중for문으로 노가다하는 코드를 짜버림...
    👉비트 연산자.. 정보처리기사 딸 때 열심히 공부했지만 오랜만에 봐서 그런지, 실제로 사용해보지 않아서 그런지 낯설었다..ㅜㅜ 또 하나 배워간다!

6. 다른 사람의 코드 첨부

function solution(n, arr1, arr2) {
    return arr1.map((i, index) =>('0'.repeat(n) + (i | arr2[index]).toString(2)).slice(-n)).map(i => i.replace(/0/g, ' ').replace(/1/g, '#'));
}
profile
개발자를 꿈꾸는 햇병아리입니다.

0개의 댓글