자료구조 및 알고리즘/JavaScript Practice

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

Ryomi 2024. 12. 21. 21:30
728x90
반응형

24년 12월 21일
해결한 문제 갯수: 5

 

문제 설명

문제 분석

  • 지도는 한 변의 길이가 n인 정사각형 배열입니다.
  • 각각의 지도는 이진수로 암호화되어 있습니다.
  • 암호화된 배열은 각 가로줄에서 벽 부분을 1, 공백 부분을 0으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열입니다.

 

첫 번째 접근 : reduce() -   O(n²)

function solution(n, arr1, arr2) {
    return arr1.reduce((answer, c, i) => {
        // 두 배열의 숫자를 이진수 문자열로 변환
        let str1 = c.toString(2)
        let str2 = (arr2[i]).toString(2)
        
        // n자리 이진수로 맞추기 위해 앞에 0 채우기
        if(str1.length < n) str1 = '0'.repeat(n - str1.length) + str1
        if(str2.length < n) str2 = '0'.repeat(n - str2.length) + str2
        
        // 두 이진수를 비교하여 지도 생성
        const str = Array.from(str1).reduce((a, l, i) => {
            a += l === '1' || str2[i] === '1' ? '#' : ' '
            return a
        }, '')
        
        answer.push(str)
        return answer
    }, [])
}
  • 외부 reduce()
    • arr1 배열을 순회하면서 각 숫자를 처리합니다.
    • 최종적으로 해독된 지도를 담을 배열을 생성합니다.
  • 이진수 변환 및 자릿수 맞추기
    • toString(2)를 사용해 10진수를 2진수 문자열로 변환합니다.
    • repeat()으로 부족한 자릿수만큼 앞에 '0'을 채웁니다.
  • 내부 reduce()
    • 두 이진수 문자열을 비교하여 최종 지도를 생성합니다.
    • OR 연산의 원리를 이용: 둘 중 하나라도 '1'이면 벽('#')으로 표시합니다.

 

두 번째 접근 : 비트 OR 연산

function solution(n, arr1, arr2) {
    return Array(n).fill().map((_, i) => {
        return (arr1[i] | arr2[i])
            .toString(2)
            .padStart(n, '0')
            .split('')
            .map(v => v === '1' ? '#' : ' ')
            .join('');
    });
}
  • 비트 연산자: | (OR) 연산자로 두 배열의 비교를 단순화했습니다
  • padStart(): repeat() 대신 문자열 앞 패딩을 위한 메서드인 padStart()를 사용했습니다.
728x90
반응형