비밀지도
https://programmers.co.kr/learn/courses/30/lessons/17681
먼저 비트연산 논리곱 (|) 연산자로 arr1 과 arr2를 계산하여 2진수로 바꿔준다.
그리고 나서 for문으로 secretMap의 요소를 돌면서 요소들을 또 split으로 끊어주고 1일 때 # 0일때 공백 으로 리턴하고 다시 join으로 묶어서 answer배열에 넣어주었다.
이렇게 풀고나니 2진수로 바꿨을 때 맨앞자리가 0 인 숫자는 0이 생략되어서 결과값이 정답과 다르게 나왔다.
그래서 n보다 길이가 짫은 숫자는 앞에서부터 길이가 n이 될 때까지 0을 붙여주었다.
이 접근방식으로 정답이 나오긴하는데 for문 안에서 split,map,join 을 n만큼 반복하다보니 시간 복잡도가 크게 나왔던 것 같다.
다른 분의 풀이를 보고 padStart 함수와 replace에 정규식을 포함한 풀이로 돌리니 1초 이내로 결과가 나오는 걸 확인할 수 있었다..
function solution(n, arr1, arr2) {
const secretMap = arr1.map((v, idx) => (v | arr2[idx]).toString(2));
const answer = [];
for (const i in secretMap) {
if (secretMap[i].length < n) {
const add = n - secretMap[i].length;
for (let j = 0; j < add; j++) {
secretMap[i] = "0" + secretMap[i];
}
}
console.log(secretMap[i].length);
answer.push(
secretMap[i]
.split("")
.map((v) => {
if (v == 1) return "#";
if (v == 0) return " ";
})
.join("")
);
}
return answer;
} // 너무 오래걸림
다시 푼 풀이
function solution(n,arr1,arr2){
return arr1.map((v,idx) => (v | arr2[idx]).toString(2).padStart(n,0).replace(/0/g,' ').replace(/1/g,'#'))
}
현재 문자열의 시작을 다른 문자열로 채워, 주어진 길이를 만족하는 새로운 문자열을 반환. 채워넣기는 대상 문자열의 시작(좌측)부터 적용된다.
syntax
str.padStart(targetLength [, padString])
매개변수
ex)
'abc'.padStart(10); // " abc"
'abc'.padStart(10, "foo"); // "foofoofabc"
'abc'.padStart(6,"123465"); // "123abc"
'abc'.padStart(8, "0"); // "00000abc"
'abc'.padStart(1); // "abc"
다시 봐도 내가 처음 푼 풀이는 시간이 많이 걸리게 푼 것 같다. 처음엔 시간 복잡도가 좀 걸리더라도 풀어보자 라는 마음가짐으로 풀긴했는데 그러다보니 너무 복잡하게 풀게되었다. 다른 사람의 풀이를 보고 이해를 못하는 것도 아닌데 왜 생각을 못했을까 ㅠ
js 내장함수를 더 공부하고 효율성에 중점을 둔 풀이를 할 수 있도록 노력해야겠다