https://school.programmers.co.kr/learn/courses/30/lessons/17681
카카오 해설을 보니 비트 연산을 잘 다룰 수 있는지 묻고자 하는 문제라고 되어있다.
물론 if else도 정답으로 간주되지만 출제자의 의도는 비트 연산자 사용이다.
https://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/
나의 풀이
function solution(n, arr1, arr2) {
let decode = []
let arr1Box = []
for(i=0; i<n; i++){
while(arr1[i] > 0 || arr2[i] >0){
if(arr1[i] % 2 === 0 && arr2[i] % 2 === 0){
arr1[i] = arr1[i] / 2
arr2[i] = arr2[i] / 2
arr1Box.unshift(" ")
}else{
arr1[i] = Math.floor(arr1[i] / 2)
arr2[i] = Math.floor(arr2[i] / 2)
arr1Box.unshift("#")
}
}
while(arr1Box.length < n) arr1Box.unshift(" ");
decode.push([...arr1Box].join(""));
arr1Box = []
}
return decode;
}
결국 비밀지도만 알면되기에 for문으로 두 개의 배열을 같이 계산해줬다.
둘다 나머지가 0일때만 공백으로 해주고 그 외에 모든 경우에 벽("#")을 세워줬다.
그리고 1같은 경우 2진법도 1이기에 자리수가 부족하다 따라서 앞 부분은 전부 공백으로 채워주는 while도 추가하였다.
다른 사람 풀이 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;
}
나는 if절로 구분을해서 배열안에 unshift를 했는데 이분은 s = (num1%2 + num2%2) ? "#" + s : " "+s;로 변수 s안에 계속 추가해줬다.
이렇게 하면 나중에 배열의 길이가 부족해서 공백을 채워주는 작업을 따로 해주지 않아도 된다. \
어차피 안쪽 for배열은 n까지 반복을 하기에 배열의 길이는 항상 일정하고
공백을 채워줘야하는 곳에는 계속 나머지가 0이기에 " " + s가 되어서 앞쪽에 공백이 계속 채워지는 원리이다.
내가 푼 방식보다 이 방식이 더 좋은 것같다. 읽기에도 걸리는 시간도
다른 사람 풀이 2)
이렇게 풀어야 카카오의 출제의도에 부합하다
function solution(n, arr1, arr2) {
return arr1.map((v, i) => addZero(n, (v | arr2[i]).toString(2)).replace(/1|0/g, (a) =>{
+a ? '#' : ' '}));
}
const addZero = (n, s) => {
return '0'.repeat(n - s.length) + s;
}
addZero 함수에 n과 v | arr2[i] 를 계산한뒤 2진법으로 바꾸고 그 이진 법으로된 값으로 replace를 실행시켰다.
replace 에서는 1 또는 0 을 전역 검색해서 찾으면 0이아니면 "#" 0이면 " " 공백으로 대체되도록하였다.
여기서 addZero 함수는 배열길이가 짧은 곳에 앞쪽에 0을 추가해준다 그럼 자동으로 공백이 앞쪽에 추가된다.
'알고리즘 > 프로그래머스 - JS' 카테고리의 다른 글
[프로그래머스-JS] [카카오][1차] 다크게임 <문자열 처리> (0) | 2022.07.26 |
---|---|
[프로그래머스-JS]level.1 가운데 글자 가져오기 (0) | 2022.07.23 |
[프로그래머스-JS] level.1 부족한 금액 계산하기 (0) | 2022.07.22 |
[프로그래머스-JS] level.1 나머지가 1이 되는 수 찾기 (0) | 2022.07.22 |
[프로그래머스-JS] level.1 최소직사각형 (0) | 2022.07.22 |