๋ฐ˜์‘ํ˜•
๊ธ€ ์ˆ˜์ •์‚ฌํ•ญ์€ ๋…ธ์…˜ ํŽ˜์ด์ง€์— ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”

 

2018๋…„ ์นด์นด์˜ค ๋ธ”๋ผ์ธ๋“œ ํ…Œ์ŠคํŠธ 1์ฐจ ๋น„๋ฐ€์ง€๋„ ๋ฌธ์ œ(๋ฌธ์ œ ๋ฒˆํ˜ธ 17681). ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” arr1 arr2 n ์ด๋ ‡๊ฒŒ 3๊ฐœ๋ฅผ ๋ฐ›์œผ๋ฉฐ, n์€ ํ•œ ๋ณ€์˜ ๊ธธ์ด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค(๋ฐฐ์—ด ๊ฐ ์š”์†Œ๋ฅผ ์ด์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•œ ํ›„์˜ length).

 

โถ 2๊ฐœ์˜ ๋ฐฐ์—ด์„ ๋ฐ›์•„

[9, 20, 28, 18, 11]; // arr1
[30, 1, 21, 17, 28]; // arr2

 

โท ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๋ฅผ 2์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•œ ๋’ค (10์ง„์ˆ˜ → 2์ง„์ˆ˜ ๋ณ€ํ™˜์€ ๋…ธํŠธ ์ฐธ๊ณ )

['01001', '10100', '11100', '10010', '01011']; // arr1
['11110', '00001', '10101', '10001', '11100']; // arr2

 

โธ 0' ' ๊ณต๋ฐฑ, 1# ์œผ๋กœ ๋ณ€ํ™˜

[' #  #', '# #  ', '###  ', '#  # ', ' # ##']; // arr1
['#### ', '    #', '# # #', '#   #', '###  ']; // arr2

 

โน ๊ฐ ๋ฐฐ์—ด ๋ณ‘ํ•ฉ. arr1[i][j]์™€ arr2[i][j]๋ฅผ ๋น„๊ตํ•  ๋•Œ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ #์ด๋ฉด ๊ทธ๋Œ€๋กœ # ์‚ฌ์šฉ

// arr1, arr2 ์ฒซ๋ฒˆ์งธ ์š”์†Œ ๋น„๊ต
' #  #'
'#### '
-------
'#####'

 

๊ฒฐ๊ณผ โ–ผ

["#####","# # #", "### #", "# ##", "#####"];

 

โบ ํ•ด๊ฒฐ ๋ฐฉ์‹์„ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค

 

๋‚ด๊ฐ€ ํ‘ผ ๋ฐฉ์‹


map, reduce๋ฅผ ์ด์šฉํ•ด์„œ ์›์‹œ์ ์œผ๋กœ ํ’€์—ˆ๋‹ค.

 

โถ ๋ฐฐ์—ด ๊ฐ ์š”์†Œ๋ฅผ 2์ง„์ˆ˜๋กœ ๋ณ€ํ™˜

const convertToBinary = (arr) => {
  return arr.reduce((acc, cur) => {
    let converted = cur.toString(2);
    converted = '0'.repeat(n - converted.length) + converted;
    return acc.concat(converted);
  }, []);
};

const map1 = convertToBinary(arr1);
const map2 = convertToBinary(arr2);

 

์ผ๋ถ€ ์ˆซ์ž๋Š” ์ด์ง„์ˆ˜ ๋ณ€ํ™˜ ํ›„์˜ length๊ฐ€ n๋ณด๋‹ค ์ž‘๊ธฐ ๋•Œ๋ฌธ์— repeat() ๋ฉ”์„œ๋“œ๋กœ ์ž๋ฆฟ์ˆ˜๋ฅผ ๋งž์ถฐ์ค€๋‹ค.

// length(์ž๋ฆฟ์ˆ˜)๊ฐ€ ๋งž์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ์ด์ง„์ˆ˜๋ฅผ ๋น„๊ตํ•˜๊ธฐ ์• ๋งคํ•˜๋‹ค
'1001'; // ์ˆซ์ž 9 ์ด์ง„์ˆ˜(arr1[0][0])
'11110'; // ์ˆซ์ž 30 ์ด์ง„์ˆ˜(arr2[0][0])

// repeat ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ˆซ์ž 9 ์ด์ง„์ˆ˜์˜ ๋ถ€์กฑํ•œ ์ž๋ฆฟ์ˆ˜๋งŒํผ '0' ์ถ”๊ฐ€
// n์€ 5๋ผ๊ณ  ๊ฐ€์ •
'0'.repeat(n - '1001'.length) + '1001'; // '01001'

 

โท 0' ' ๊ณต๋ฐฑ, 1# ์œผ๋กœ ๋ณ€ํ™˜ — ์ด ๋ถ€๋ถ„์€ OR ๋น„ํŠธ ์—ฐ์‚ฐ์ž๋กœ ๊น”๋”ํ•˜๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค

return map1.map((el, i1) =>
  el
    .split('')
    .reduce(
      (acc, cur, i2) =>
        cur === '1' || map2[i1][i2] === '1' ? acc + '#' : acc + ' ',
      '',
    ),
);

 

๋ ˆํผ๋Ÿฐ์Šค ์ฝ”๋“œ ๋ถ„์„


 

Bitwise Operator - Javascript Basic & Detail

์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ AND๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ && ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ OR์„ ํ‘œํ˜„ํ• ๋•Œ || ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์™œ ๋‘ ๊ฐœ์”ฉ ์‚ฌ์šฉํ•ด์„œ ํ‘œํ˜„์„ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ? ํ•˜๋‚˜๋กœ๋Š” ํ‘œํ˜„์ด ์•ˆ๋˜๋Š” ๊ฒƒ์ธ๊ฐ€? ์ด์œ ๋Š” ํ•œ ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” &, |๋Š” ๋น„ํŠธ์—ฐ์‚ฐ์ž

seonhyungjo.github.io

 

๋น„ํŠธ ์—ฐ์‚ฐ์ž

๐Ÿ’ก ๋น„ํŠธ๋Š” ์ด์ง„(Binary) ์ˆซ์ž๋งŒ ์‚ฌ์šฉํ•œ๋‹ค. ๋น„ํŠธ ์—ฐ์‚ฐ์ž๋Š” ๋น„ํŠธ ์ˆ˜์ค€์—์„œ ๋ณ€์ˆ˜์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋น„ํŠธ ์ˆ˜์ค€์—์„œ์˜ ํ‰๊ฐ€๋Š” ์ผ๋ฐ˜ ๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž๋ณด๋‹ค ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.

 

์ข‹์•„์š”๋ฅผ ๊ฐ€์žฅ ๋งŽ์ด ๋ฐ›์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ ์ •๋ง ๊น”๋”ํ•˜๋‹ค. v | arr2[i] ์š” ์ฝ”๋“œ๋Š” ๋‹จ์ˆœํžˆ OR ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ์ง€ ์•Œ์•˜๋Š”๋ฐ ์ž์„ธํžˆ ๋ณด๋‹ˆ Vertical Bar |๊ฐ€ ํ•˜๋‚˜๋ฐ–์— ์—†๋‹ค. ์ฐพ์•„๋ณด๋‹ˆ ๋น„ํŠธ์—ฐ์‚ฐ์ž์˜ OR์ด๋‹ค.

function solution2(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;
};

 

๋น„ํŠธ ์—ฐ์‚ฐ์ž์˜ |(OR)์€ || ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž์™€ ๋น„์Šทํ•˜๋‹ค. ๋น„๊ตํ•˜๋Š” ๋น„ํŠธ๊ฐ€ 0๊ณผ 1์ด๋ผ๋ฉด 1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ฌธ์ œ์—์„œ ์š”๊ตฌํ•˜๋Š” ๋กœ์ง(๋น„๊ตํ•˜๋Š” ๊ฐ’์ด 0 ํ˜น์€ 1์ด๋ฉด 1 ๋ฐ˜ํ™˜)์— OR ๋น„ํŠธ ์—ฐ์‚ฐ์ž๋ฅผ ์ ์šฉํ•˜๋ฉด ์ •ํ™•ํžˆ ๋งž์•„๋–จ์–ด์ง„๋‹ค.

console.log(46 | 27); // 63
46์˜ 2์ง„์ˆ˜๋Š” 101110, 27์˜ 2์ง„์ˆ˜๋Š” 11011
101110 (46)
011011 (27)
------
111111 (63)

 

str.replace / ์ •๊ทœ์‹

str.replace(regexp|substr, newSubstr|function)

 

replace() ๋ฉ”์„œ๋“œ์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž์—” ์ •๊ทœ์‹๋„ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ๋‘๋ฒˆ์งธ ์ธ์ž์—” ์ผ์น˜ํ•˜๋Š” ์š”์†Œ์— ์–ด๋–ค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ• ์ง€์— ๋Œ€ํ•œ ์ฝœ๋ฐฑ์„ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค.

'01001'.replace(/0|1/g, '*'); // '*****'
'01001'.replace(/0|1/g, (n) => (Number(n) ? ' ' : '#')); // '# ## '
// 0์€ false๋กœ ํ‰๊ฐ€๋˜๋ฏ€๋กœ ' ' ๋นˆ๋ฌธ์ž์—ด ๋ฐ˜ํ™˜, ๊ทธ ์™ธ์—” '#' ๋ฐ˜ํ™˜

 

์ฐธ๊ณ ๋กœ ์ •๊ทœ์‹์—์„œ | ๊ต์ฒด๊ตฌ๋ฌธ์€ OR ์—ฐ์‚ฐ์ž์™€ ๋™์ผํ•˜๋‹ค.

const re = /0|1/;
'01001'.match(re); // ['0', index: 0, input: '01001', groups: undefined]

 

์ •๊ทœ์‹์—์„œ g(์ „์—ญ๊ฒ€์ƒ‰) ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ๋‚ด์šฉ์„ ์ฐพ๋Š”๋‹ค. g ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†์œผ๋ฉด ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ์ฒซ๋ฒˆ์งธ ๊ฒฐ๊ณผ๋งŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

const re = /0|1/g;
'01001'.match(re); // ['0', '1', '0', '0', '1']

 

์ฝ”๋“œ ํ’€์ด

โถ arr1 ์š”์†Œ ์ˆœํšŒ

 

โท arr1[i] arr2[i]์— OR ๋น„ํŠธ ์—ฐ์‚ฐ์ž ์ ์šฉ

// arr1[i]๋Š” 14, arr2[i]๋Š” 22๋กœ ๊ฐ€์ •
14 | 22; // 30

/*
01110 (14)
10110 (22)
-----
11110 (30)
*/

 

โธ ์ด์ง„์ˆ˜ ๋ณ€ํ™˜

(30).toString(2); // '11110'

 

โน ๋ถ€์กฑํ•œ ์ž๋ฆฌ์ˆ˜์— '0'์ถ”๊ฐ€

const addZero = (n, s) => '0'.repeat(n - s.length) + s;

// n์€ 6(์ด๋ผ๊ณ  ๊ฐ€์ •), s๋Š” '11110'
addZero(6, '11110'); // '011110'

 

โบ 0' ', 1# ์œผ๋กœ ๋ณ€ํ™˜

'011110'.replace(/1|0/g, (n) => (+n ? '#' : ' ')); // ' #### '
// +'0' ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜๋ฉด ์ˆซ์ž๋กœ ํ˜•๋ณ€ํ™˜. Number('0')๊ณผ ๋™์ผ
๋ฐ˜์‘ํ˜•