알고리즘

[알고리즘]프로그래머스LV.1 - 비밀지도

로돌씨 2024. 6. 11. 16:15

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

 

프로그래머스

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

programmers.co.kr

 

문제

 

나의 풀이

function solution(n, arr1, arr2) {
    var answer = [];
    //arr 을 만들고 수에 해당하는 1을 만들어 1 또는 2 로만들어줌 , 만약 1 이상이라면 맵을 이용해 공백 또는 # 으로 바꿔준다.
    var toStr1 = [];
    var toStr2 = [];
    var str1 =[];
    var str2 = [];
    var arr = Array(n).fill(0)
    
    for(let i = 0 ; i < arr1.length; i ++){
        let update = arr1[i].toString(2).padStart( n ,'0')
        toStr1.push(update)
    }
    for(let i = 0 ; i < arr2.length; i ++){
        let update = arr2[i].toString(2).padStart( n ,'0')
        toStr2.push(update)
    }
    for(let i = 0; i < toStr1.length; i ++){
        str1.push(toStr1[i].split("").map(a=> a == "1"? a = "#" : " "))

    }
    for(let i = 0; i <toStr2.length; i ++){
        str2.push(toStr2[i].split("").map(a=> a == "1"? a = "#" : " "))
    }
    
    for(let i = 0; i<str1.length; i ++){
        for(let j = 0; j<str1[i].length; j ++){
            if(str1[i][j] == "#" || str2[i][j] == "#" ){
                if(str1[i][j] == "#"){
                    str1[i][j] =="#"
                }else{
                    str1[i][j] += "#"
                }
            }
        }
    }
    for(let i = 0 ; i <str1.length; i++){
        for(let j = 0; j<str1[i].length; j ++){
            str1[i][j] == " #" ? str1[i][j] = "#" : str1[i][j]
        }
        answer.push(str1[i].join(""))
    }
    return answer;
}

 

진짜 그냥 뇌빼고 하드코딩을 했다... 반복문만 몇개를 ... 분명 쉬울거라 생각했는데...어려웠다.

 

클린코딩 

function solution(n, arr1, arr2) {
    // 주어진 배열을 2진수 문자열로 변환하고 앞에 0을 채우는 함수
    const toBinaryString = (num) => num.toString(2).padStart(n, '0');

    // 2개의 배열을 2진수 문자열로 변환하여 병합
    const binaryArr1 = arr1.map(toBinaryString);
    const binaryArr2 = arr2.map(toBinaryString);

    // 두 배열을 OR 연산한 후, 1은 #, 0은 공백으로 변환
    const mergedArr = binaryArr1.map((bin1, i) => 
        bin1.split('').map((bit, j) => 
            (bit === '1' || binaryArr2[i][j] === '1') ? '#' : ' '
        ).join('')
    );

    return mergedArr;
}

// 예제 사용법
const n = 5;
const arr1 = [9, 20, 28, 18, 11];
const arr2 = [30, 1, 21, 17, 28];

console.log(solution(n, arr1, arr2)); 
// ["#####", "# # #", "### #", "# ##", "#####"]