코딩테스트/비트마스크
Softeer 전광판
의현
2025. 5. 22. 23:15
문제 풀이
전광판의 정보를 저장하기위해 binary 형태로 표시 순서는 위에 그림처럼 0~6자리수에 0, 1로 표현
또한, 빈 값을 표시하기 위해 ' ' -> '0000000'로 표시
각 자리수에 최소한의 클릭으로 전광판이 같아지도록 만들어야 함 -> 비트연산자 xor 이용
-> xor이란 같은 자리에 값이 다를 경우 1리턴, 같을 경우 0리턴
최종 로직
1. max 길이 만큼 앞에 ' '로 채우기
2. 각 자리수의 binaryFormat에서 binary값 구하기
3. xor연산을 사용하기위해 10진수 형태(parseInt(string, 2))로 만들고 xor연산 후 1의 갯수를 파악하기 위해 다시 2진수로 변경(.toString(2))
4. changeCount에 1의 갯수만큼 더하기
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const inputs = [];
const binaryFormat = new Map([
[' ', '0000000'],
['0', '1111110'],
['1', '0001100'],
['2', '1011011'],
['3', '0011111'],
['4', '0101101'],
['5', '0110111'],
['6', '1110111'],
['7', '0111100'],
['8', '1111111'],
['9', '0111111'],
])
rl.on('line', (input) => {
inputs.push(input);
}).on('close', () => {
const t = parseInt(inputs[0]);
for (let i = 1; i <= t; i++) {
let [num1, num2] = inputs[i].split(' ');
let changeCount = 0;
const max_length = Math.max(num1.length, num2.length);
num1 = num1.padStart(max_length, ' ');
num2 = num2.padStart(max_length, ' ');
for (let i = 0; i < max_length; i++) {
let num1_binary = binaryFormat.get(num1[i]);
let num2_binary = binaryFormat.get(num2[i]);
let xor_binary = (parseInt(num1_binary, 2)^parseInt(num2_binary, 2)).toString(2);
changeCount += xor_binary.split('').filter(v => v === '1').length;
}
console.log(changeCount);
}
process.exit(0);
});
결론
2진수의 문자열을 10진수로 바꾸는 방법 -> parseInt('string', 2); -> parseInt내부의 2는 앞의 string이 2진수로 받는다라는 의미
10진수를 2진수 문자열로 바꾸는 방법 -> (숫자).toString(2); -> toString내부의 2는 2진수로 만들겠다는 의미
xor -> ^ 연산자를 사용하면 됨