의현 2025. 5. 22. 23:15

링크 : https://softeer.ai/app/assessment/index.html?xid=472149&xsrfToken=SMreoIhQcKRTyLHWPRxmbSqP7ldeHzwT&testType=practice

문제 풀이

전광판의 정보를 저장하기위해 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 -> ^ 연산자를 사용하면 됨