Programmers Alogrithm
2018 KAKAO BLIND RECRUITMENT - [1차] 비밀지도
Boo0
2022. 9. 16. 23:20
https://school.programmers.co.kr/learn/courses/30/lessons/17681
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 해석
길이가 n인 10진수를 원소로 갖는 배열 2개가 주어지고 10진수를 2진수로 만들어 부호화 시키는 문제이다.
멀티미디어 과목을 수강하면서 부호화 압축 알고리즘을 배워서 관심이 갔던 문제이다.
문제 풀이
우선 처음 떠올렸던 로직은
- 2진수로 변환시킨다.
- n만큼의 비트를 가지는 2진수로 만든다. (길이가 n인 문자열로 만든다)
- 2개의 배열을 각각 board로 만든다.
- 두개의 board를 비교하기 위해서 pt1, pt2 변수로 board1과 board2의 각 원소를 가리키게 한다.
- 양쪽이 1이면 "#" 그 외엔 " "으로 만들어서 새로운 board를 return한다.
function binary(n, arr) {
let board = [];
let bin = "";
for (let x of arr) {
bin = "";
if (x.toString(2).length < n) {
bin = x.toString(2);
for (let i = 0; i < n - x.toString(2).length; i++) {
bin = "0" + bin;
}
board.push(bin);
} else {
board.push(x.toString(2));
}
}
return board;
}
function solution(n, arr1, arr2) {
var answer = [];
let board1;
let board2;
board1 = binary(n, arr1);
board2 = binary(n, arr2);
let pt1, pt2;
let code;
for (let i = 0; i < n; i++) {
code = "";
for (let j = 0; j < n; j++) {
pt1 = board1[i][j];
pt2 = board2[i][j];
if (pt1 == 0 && pt2 == 0) {
code += " ";
} else {
code += "#";
}
}
answer.push(code);
}
return answer;
}
풀이는 위와 같다.
2진수로 만드는 부분까지는 큰 문제가 없었고 길이가 n인 문자열로 만드는 로직도 크게 어렵지 않았다.
그리고 문자열인 2진수의 각 원소를 훑기 위해서 for of 반복문을 사용하려 했으나 두개의 인덱스를 동시에 사용해야 하기 때문에 for of 반복문을 사용할 수 없었다.
charAt 메소드를 사용해야 하는가 했지만 위와 같은 방법으로 인덱스를 사용해서 문자열 내의 문자를 가리켰는데 문제가 되지 않았다.
문제가 될 줄 알고 오히려 시간을 오랫동안 허비했다.
그리고 부호화된 문자를 answer 배열에 push하면서 최종 결과인 board를 생성하고 return했다.
처음 생각했던 로직이 그대로 맞아떨어져서 쓸데없는 시행착오가 많았지만 그래도 풀고나서 기분이 나쁘지 않은 문제였다.