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
반응형
'자료구조 및 알고리즘 > JavaScript Practice' 카테고리의 다른 글
[프로그래머스] 과일 장수 (1) | 2024.12.24 |
---|---|
[프로그래머스] 포켓몬 (0) | 2024.12.23 |
[프로그래머스] 숫자 문자열과 영단어 (0) | 2024.12.20 |
[프로그래머스] 시저암호 (1) | 2024.12.19 |
[프로그래머스] 부족한 금액 계산하기 (1) | 2024.12.18 |