비밀지도
https://school.programmers.co.kr/learn/courses/30/lessons/17681
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
나의 코드
function zerofill(value, fillCount){
let result = value;
if(typeof value === "number") result = value.toString()
return result.padStart(fillCount, '0')
}
function solution(n, arr1, arr2) {
let answer = [];
function change(arr){
return arr.map((el) => el.toString(2)).map((e) =>
e.length !== n ? zerofill(e, n) : e
)
}
let change01 = change(arr1)
let change02 = change(arr2)
for(let i = 0; i < change01.length; i++){
let e = Number(change01[i]) + Number(change02[i])
answer.push(zerofill(e, n))
}
answer = answer.map(e => e.toString()).map(e => {
let str = ``
for(const num of e){
if(num !== `0`){
str += `#`
} else {
str += ` `
}
}
return str
})
return answer;
}
- 먼저 받아오는 arr들을 이진수로 변환한다.
- 변환한 이진수들은 숫자로 변환되기 때문에 앞자리가 0인 것(예: 00010인 경우, 10으로 변환)이 비어버리므로 0을 채우기 위하여 zerofill 함수를 사용하여 0을 채워주었다.
- 변환된 숫자들을 change01, change02로 변수에 할당한다. 각 변수들은 모두 문자열이므로 숫자열로 변경하여 더해주고, 그 숫자들을 모두 answer 배열에 담아준다.
- 더해준 숫자가 만약에 0이 아니라면 #을 채우고, 0이라면 빈문자열을 채우는 것으로 조건문을 활용하여 나누었다.
다른 사람의 풀이
- 문제는 풀이하였지만 너무 길고 복잡하게 풀이한 것이 있어서 다른 사람의 풀이를 참고하기로 하였다.
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 함수는 주어진 문자열 s의 길이를 n으로 맞추기 위하여 앞에 0을 추가하는 역할을 한다. 나의 풀이에서 zerofill과 같은 역할을 한다.
- '0'.repeat(n - s.length)는 '0'을 (n - s.length)번 반복한 문자열을 생성한다. 즉, s의 길이가 n보다 작을 경우에는 앞에 추가할 0의 개수를 계산한다.
- 예를 들어, s가 "101"이고 n이 5라면, s의 길이는 3이므로 n과의 차이인 2만큼 앞에 0을 추가하여 길이를 맞출 수 있다. 따라서, 최종 결과는 "00101"가 된다.
- (v | arr2[i])는 v와 arr2[i] 각 비트의 OR 연산을 수행한 결과이다. 두 배열의 해당 인덱스에 있는 숫자를 이진수로 표현하고 비트별로 OR 연산한다.
- (v | arr2[i]).toString(2)는 이진수로 표현된 값을 문자열로 변환한다.
- addZero(n, (v | arr2[i]).toString(2))는 addZero 함수를 호출하여 변환된 이진수 문자열의 길이를 n으로 맞추는 작업을 수행한다.
- addZero(n, (v | arr2[i]).toString(2)).replace(/1|0/g, a => +a ? '#' : ' ')는 앞서 맞춘 이진수 문자열에서 1과 0을 각각 '#'과 ' '으로 치환하는 작업을 수행한다.
- arr1.map(...)은 arr1 배열의 각 요소에 대해 앞서 수행한 작업을 반복하고, 그 결과를 새로운 배열로 반환한다. 최종적으로 #으로 이루어진 배열이 반환되어 결과가 나온다.
'JS > 알고리즘(코테)' 카테고리의 다른 글
프로그래머스 코딩테스트 LV.1 - 콜라 문제 (0) | 2023.07.13 |
---|---|
프로그래머스 코딩테스트 LV.1 - 푸드 파이트 대회 (0) | 2023.07.11 |
프로그래머스 코딩테스트 LV.1 - 최소직사각형 (0) | 2023.07.02 |
프로그래머스 코딩테스트 LV. 1 - 삼총사 (0) | 2023.07.01 |
프로그래머스 코딩테스트 LV.0 - 왼쪽 오른쪽 (0) | 2023.06.07 |