Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 정렬
- 해시
- state
- 병합 정렬
- Node
- 코딩테스트
- 합병 정렬
- node.js
- 기술면접
- 브루트포스
- hash
- 완전탐색
- 자료구조
- 최소공배수
- 알고리즘
- sort
- CSS
- 자바스크립트
- 딥다이브
- 백준
- 연결리스트
- useState
- 프로그래머스
- JS
- 코테
- 정규표현식
- 리액트
- react
- BOJ
- JavaScript
Archives
- Today
- Total
가치투자자
[프로그래머스] 비밀지도 본문
728x90
반응형
Programmers : 비밀지도
🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/17681
💬 문제
이 문제는 진수변환 과 문자열 에 대한 이해가 있다면, 충분히 풀 수 있는 문제였다.
- 암호화된 비밀지도를 풀기 위해 지도의 한 변의 길이 n과 정수 배열 arr1(지도1)과 arr2(지도2)가 주어진다.
- 각 배열의 정수를 이진수로 변환했을 때, 이진수의 0과 1이 지도의 공백(" ")과 벽("#")에 대한 정보이다 - 두 지도를 겹쳤을 때
- 모두 공백인 자리는 공백이며,
- 둘 중 어느 하나라도 벽이 있다면 그 자리는 벽이다 - 두 지도를 겹쳐서 최종 지도의 모습(배열)을 출력해주면 된다.
728x90
💡 입출력 예시
첫 번째 예제를 보면 배열 arr1를 이진법으로 변환하면 [1001, 10100, 11100, 10010, 1011]이 되며, 배열 arr2를 이진법으로 변환하면 [11110, 1, 10101, 10001, 11100]이 된다.
이 두 배열을 겹쳤을 때, [11111, 10101, 11101, 10011, 11111]이 되므로, 결과는 ['#####', '# # #', '### #', '# ##', '#####']이 된다.
반응형
🔑 풀이1
- 배열 arr1와 arr2를 이진수로 변환해준다.
- 두 지도를 겹치기 위해 각 줄의 수를 더해준다.
- 이때 n자리수가 아닐 수 있으므로 padStart() 메서드를 사용해 아닌 부분은 0으로 채워준다
- 이진수끼리 더했으므로 각 자리수는 0, 1, 2 중 하나이다 - 둘 다 공백(0)인 경우에만 공백이므로, 0과 0을 더한 0일 때만 공백(" ")이 나와야 한다.
- 그 외에 1과 2는 벽("#")으로 바꿔준다.
function solution(n, arr1, arr2) {
const answer = [];
const sum = [];
// 진수변환
let one = arr1.map(num => num.toString(2));
let two = arr2.map(num => num.toString(2));
// 두 지도 겹치기
for (let i=0; i < n; i++) {
sum.push(
String(Number(one[i])+Number(two[i])).padStart(n, 0)
);
}
// 공백인지, 벽인지 판별
for (let num of sum) {
answer.push(
num.replace(/0/g, " ").replace(/1|2/g, "#")
);
}
return answer;
}
실행 결과와 채점 결과는 다음과 같다.
🔑 풀이2 : 비트 연산자
이 문제는 비트 OR 연산자 로도 풀 수 있다.
비트 연산자는 비트(bit) 단위로 이진수(binary)에 대한 논리 연산을 수행하는 연산자이다. 비트 연산자 중 OR 연산자는 대응대는 두 비트 중 하나라도 1이면 1을 반환하며, 두 비트 모두 0일때만 0을 반환한다.
예를 들어, 2와 3의 비트 OR 연산자 결과는 다음과 같다.
십진수가 있다면, 그것을 이진수로 바꿔 비교한 다음 그걸 다시 십진수로 반환해준다.
const num = 2 | 3;
// 2 0010
// 3 0011
// 0011
console.log(num); // 3
문제 풀이2
- n줄에 걸쳐 배열1과 배열2의 각 수를 비트 OR 연산자로 비교하여 두 지도를 겹쳐준다.
- 둘 다 공백일 때만 0이 되므로, 비트 OR 연산자를 사용하면 0 | 0은 0을 반환해준다
- 둘 중 하나라도 벽(1)이 있다면, 하나라도 1이 있으므로 비트 OR 연산자는 1을 반환해준다 - 겹친 결과를 이진수로 바꾸고, n자리수를 채워주기 위해 padStart() 메서드로 0을 채워준다.
- 겹친 결과는 0 또는 1로 구성된 이진수이므로, 정규표현식으로 공백(" ") 또는 벽("#")으로 바꿔준다.
function solution(n, arr1, arr2) {
const answer = [];
for (let i=0; i < n; i++) {
answer.push(
(arr1[i] | arr2[i]).toString(2) // 두 지도 겹치기
.padStart(n, 0)
.replace(/0/g, " ").replace(/1/g, "#") // 공백인지, 벽인지 판별
)
}
return answer;
}
실행 결과와 채점 결과는 다음과 같다.
</> 끊임없이 성장하기 위해 공부한 내용을 글로 작성하고 있습니다. 틀린 부분이나 추가해야 할 부분이 있다면 언제든 댓글로 남겨주세요❗️
References
- https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Expressions_and_operators#%EB%B9%84%ED%8A%B8_%EC%97%B0%EC%82%B0%EC%9E%90
- http://www.tcpschool.com/javascript/js_operator_bitwise
728x90
반응형
'Problem Solving > Programmers' 카테고리의 다른 글
[프로그래머스] 뉴스 클러스터링 (0) | 2023.06.29 |
---|---|
[프로그래머스] 튜플 (0) | 2023.06.29 |
[프로그래머스] 숫자 문자열과 영단어 (0) | 2023.06.22 |
[프로그래머스] 캐시 (0) | 2023.06.18 |
[프로그래머스] 의상 (1) | 2023.05.26 |