https://programmers.co.kr/learn/courses/30/lessons/17681
코딩테스트 연습 - [1차] 비밀지도
비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다
programmers.co.kr
풀이
arr1과 arr2 두 배열을 각각 2로 계속 나누어 나머지가 1이면 1, 없다면 0을 새로운 배열에 집어넣었다.
그렇게 2진수로 변환하여 for문을 돌려 각 자리마다 2진수를 더했고 1 이상인 경우 #을,
0이라면 공백을 집어넣었다.
마지막으로 join('')을 사용하여 배열을 문자열로 변환하였다. ㅠㅠ
2진수로 변환하는 과정을 간소화할 방법이 떠오르지 않아 복잡 ~~~ 하게 작성했다..
function solution(n, arr1, arr2) {
var answer = [];
for(let i=0; i<n; i++){
var ar1 = [];
var ar2 = [];
while(true){
arr1[i]%2 === 1 ? ar1.push(1):ar1.push(0);
arr1[i] = Math.floor(arr1[i]/2);
if(arr1[i] === 0){
if(ar1.length !== n){
while(ar1.length < n){
ar1.push(0);
}
break;
}
}
}
while(true){
arr2[i]%2 === 1 ? ar2.push(1):ar2.push(0);
arr2[i] = Math.floor(arr2[i]/2);
if(arr2[i] === 0){
if(ar2.length !== n){
while(ar2.length < n){
ar2.push(0);
}
break;
}
}
}
var list = [];
for(let i=0; i<n; i++){
list.push((ar1[i]+ar2[i]) >= 1 ? '#':' ');
}
answer.push(list.reverse().join(''));
}
return answer;
}
다른 사람 풀이
var solution=(n,a,b)=>a.map((a,i)=>(a|b[i]).toString(2).padStart(n,0).replace(/0/g,' ').replace(/1/g,'#'))
a(문제의 arr1에 해당) 배열을 맵핑하여 값과 인덱스를 가져왔다.
인덱스는 또 다른 배열 b(문제의 arr2에 해당)의 원소를 불러오기 위함이다.
그리고 비트 연산자!! 를 활용하여 특별한 변환 없이 a와 b[i]를 2진수의 비트 단위로 계산하였고(a|b[i] 그냥 덧셈이 아닌!),
그것을 toString()을 활용하여 2진수로 표현하였다.
그저 문자열로 변환시켜주는 메소드인줄 알았는데 이런 기능이 있었다!
a|b -> 비트 연산자(비트 단위 논리합) : 두 피연산자의 각 자리 비트의 값이 둘 다 0일 경우 해당하는 자리에 0을 반환
var solution=(n,a,b)=>a.map((a,i)=>(a|b[i]).toString(2).padStart(n,0).replace(/0/g,' ').replace(/1/g,'#'))
사진 자료가 길어 코드가 보이지 않으므로 다시 볼러 왔다.
변환된 2진수를 주어진 지도의 크기 n만큼 0으로 채워준다.
2진수의 공간이 비는 경우는 큰 자릿수 즉, 문자열의 앞부분이 되므로 문제없음!
그리고 정규표현식을 활용한 replace 메소드를 사용하여 0은 공백,
1은 #으로 바꿔주었다.
이 모든 게 한 줄로 끝나다니!!
문제를 풀고 기뻤으나 이 코드를 보고 큰 현타가 왔다..
하지만 코드를 이해했으니 다음부턴 나도 저렇게 간결한 코드를 작성할 수 있을 거라 기대해본다 ㅠㅠ!
'IT > Algorithm' 카테고리의 다른 글
프로그래머스) 내적 (0) | 2021.07.06 |
---|---|
프로그래머스) 로또의 최고 순위와 최저 순위 (0) | 2021.07.06 |
프로그래머스) 음양 더하기 (0) | 2021.07.05 |
프로그래머스) 모의고사 (0) | 2021.07.01 |
프로그래머스) 문자열 다루기 기본 (0) | 2021.07.01 |