본문 바로가기
기초다지기/JS 코딩테스트

javaScript 2018 KAKAO BLIND RECRUITMENT 비밀지도

by 김빵그 2023. 11. 24.

문제

길이가 n인 정사각형 배열로 각 칸은 공백 "" 또는 벽 # 으로 되어있을 때
전체 지도는 두 장의 지도를 겹쳐 얻을수 있는데 1, 2 중 어느 하나라도 벽인 부분은 전체 지도에서 벽이다
전체 지도의 배열 리턴

나의 풀이

function solution(n, arr1, arr2) {
    const binaryRepresentation = (num, length) => {
        const binary = num.toString(2);
        return binary.length < length ? "0".repeat(length - binary.length) + binary : binary;
    };

    const array = [];
    for (let i = 0; i < arr1.length; i++) {
        const binaryArr1 = binaryRepresentation(arr1[i], n);
        const binaryArr2 = binaryRepresentation(arr2[i], n);

        console.log(binaryArr1, binaryArr2)
        const row = binaryArr1
            .split("")
            .map((v, i) => (v === "0" && binaryArr2[i] === "0") ? " " : "#" )
            .join('')
        
         console.log(row)
         array.push(row);
    }
    return array;
    
}
  • 최대한 검색 안하면서 풀려고 노력 ㅠ
  • binary : 이진수로 변환하고 지정된 길이로 맞춘다 
    • toString을 이용하여 이진수 변환 
    • 길이가 짧다면 0을 반복한다
  • for
    • 지도 1, 2 둘 다 현재 숫자를 이진수로 변환하고 지정된 길이로 맞춘다 
    • 이진수를 겹쳐 split을 사용하여 한글자씩 나눈후 map 을 사용해 해당 계산식에 맞게 수정후 join으로 합친다
    • 글자가 0이면서 지도 2의 숫자도 0일시 " " 공백 아니면 # 을 넣는다
    • 생성된 행을 배열에 추가하고 끝

다른 풀이

- 한참 긴 코드를 이리 줄일수 있다니 ㅠ  더 노력해야겠다

function solution(n, arr1, arr2) {
    // arr1을 순회하면서 새로운 지도 배열을 생성
    return arr1.map((v, i) => {
        // 두 이진수를 OR 연산(|)을 통해 합친 뒤, 이진수로 변환하고 0으로 시작하도록 맞춤
        const combinedBinary = (v | arr2[i]).toString(2);
        const binaryWithZero = addZero(n, combinedBinary);

        // 1 또는 0을 '#' 또는 공백으로 치환하여 한 행을 생성하고 반환
        return binaryWithZero.replace(/1|0/g, a => +a ? '#' : ' ');
    });
}

// 주어진 문자열의 길이가 n이 될 때까지 왼쪽에 0을 추가하는 함수
const addZero = (n, s) => {
    return '0'.repeat(n - s.length) + s;
}

 

  • arr1을 map 함수로 순회하며 새로운 지도 배열 생성 
var solution = (n, a, b) => a.map((a, i) => (
    (a | b[i])               // OR 연산을 통해 두 이진수를 합침
    .toString(2)              // 이진수로 변환
    .padStart(n, 0)           // 주어진 길이 n으로 맞추고, 부족한 부분은 0으로 채움
    .replace(/0/g, ' ')       // 0을 공백으로 치환
    .replace(/1/g, '#')       // 1을 '#'으로 치환
));
function solution(n, arr1, arr2) {
    let num1, num2, s;
    let answer = [];

    // 주어진 숫자를 이진수로 변환하고 지도를 생성하는 반복문
    for (let i = 0; i < n; i++) {
        num1 = arr1[i];
        num2 = arr2[i];
        s = '';

        for (let j = 0; j < n; j++) {
            // 각 자릿수를 확인하여 '#' 또는 공백으로 지도를 생성
            s = (num1 % 2 + num2 % 2) ? '#' + s : ' ' + s;
            num1 = Math.floor(num1 / 2);
            num2 = Math.floor(num2 / 2);
        }

        // 생성된 행을 배열에 추가
        answer.push(s);
    }    
    return answer;
}