Skip to content

moonheekim0118/Algorithm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿณ JavaScript Algorithm's Ingredients

๐Ÿ… Digits ๊ตฌํ•˜๊ธฐ

String ์ด์šฉ - ์•ฝ๊ฐ„ ๋Š๋ฆผ but ๊ฐ„๋‹จ

  • number๋ฅผ string์œผ๋กœ ๋ฐ”๊พธ์–ด์„œ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹
  • number๋กœ ๋‹ค์‹œ ๋‹ค๋ฃจ๊ณ  ์‹ถ๋‹ค๋ฉด toInteger ์ถ”๊ฐ€ํ•ด์•ผํ•จ
number.toString(); // ์ด๋ ‡๊ฒŒํ•ด์„œ index๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ

Math ์ด์šฉ - ๋” ๋น ๋ฆ„ but ์•ฝ๊ฐ„ ๋ณต์žก

  • number๋ฅผ 10์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ๋’ท์ž๋ฆฌ๋ถ€ํ„ฐ ๋–ผ์–ด๋‚ด๋Š” ๋ฐฉ์‹
  • number๋กœ ๋‹ค์‹œ ์‰ฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Œ
let arr = [];
let number = 155;
do {
  arr.unshift(number % 10);
  number = Math.floor(number / 10);
} while (number > 0);
// arr=[1,5,5]


๐Ÿ… ์ง„์ˆ˜ ๋ณ€ํ™˜

  • 10์ง„์ˆ˜ -> 16 ์ง„์ˆ˜
let dec = 123;
let hex = dec.toString(16);
  • 10์ง„์ˆ˜ -> 2 ์ง„์ˆ˜
let dec = 123;
let bin = dec.toString(2);
  • 16์ง„์ˆ˜ -> 10์ง„์ˆ˜
let hex = "7b";
let dec = parseInt(hex, 16);
  • 2์ง„์ˆ˜ -> 10์ง„์ˆ˜
let bin = "1111011";
let dec = parseInt(bin, 2);
  • 2์ง„์ˆ˜ -> 16์ง„์ˆ˜
let bin = "1111011";
let hex = parseInt(bin, 2).toString(16);


๐Ÿ… ์ค‘๋ณต๋œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ์„ ๋•Œ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๋Š” ๋ฐ”๋กœ๋ฐ”๋กœ set ์ด๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค. new Set์„ ์ƒ์„ฑํ•˜๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐฐ์—ด์„ ๋„ฃ์œผ๋ฉด ๋ฐฐ์—ด ๋‚ด๋ถ€์˜ ์ค‘๋ณต๋œ ์š”์†Œ๊ฐ€ ์ œ๊ฑฐ๋œ๋‹ค

let set = [...new Set(array)];


๐Ÿ… 1๋ถ€ํ„ฐ N ๊นŒ์ง€์˜ ์š”์†Œ๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด ๋งŒ๋“ค๊ธฐ

const arr = Array.from({ length: n }, (_, i) => i + 1); // 1๋ถ€ํ„ฐ N ๊นŒ์ง€
const arr = Array.from(new Array(n)); // 0๋ถ€ํ„ฐ N-1 ๊นŒ์ง€


๐Ÿ… ํ•ด์‰ฌ๋งต

  • ํ•ด์‰ฌ๋งต์ด๋ž€ ํ•ด์‰ฌํ…Œ์ด๋ธ” ์ฒ˜๋Ÿผ key-value ์Œ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์—ฌ, ์ถ”ํ›„์— ์‚ฌ์šฉํ•  ๋•Œ ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ES6 Map ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ผ๋ฐ˜ ๊ฐ์ฒด์™€ ๋‹ค๋ฅธ์ ์€ key ๊ฐ’์œผ๋กœ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํƒ€์ž…์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ Linked List ๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— orderable ํ•˜๊ณ , iterable ํ•˜๋ฉฐ, ์ง€์ •๋œ size์— ๋”ฐ๋ผ ํ•œ์ •๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ €์žฅ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
let hasMap = new Map([
  [1, "first"],
  [2, "second"],
  [3, "third"],
]);
  • hasMap.size() - ํ•ด์‰ฌ๋งต์— ์ €์žฅ๋œ ์š”์†Œ ๊ฐฏ์ˆ˜ ๋ฐ˜ํ™˜
  • hasMap.get(key) - key ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ์š”์†Œ ๋ฐ˜ํ™˜
  • hasMap.has(key) - ํ•ด์‰ฌ๋งต์— key๊ฐ€ ์กด์žฌ ์—ฌ๋ถ€ ๋ฐ˜ํ™˜
  • hasMap.set(key, value) - ํ•ด์‰ฌ๋งต์— ์ €์žฅ
  • hasMap.delete(key) - key ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ์š”์†Œ ์‚ญ์ œ
  • hasMap.clear() - ๋ชจ๋“  ์—˜๋ฆฌ๋จผํŠธ ์‚ญ์ œ


๐Ÿ… ์•ŒํŒŒ๋ฒณ ์ธ๋ฑ์Šค ๊ฐ’ ์ €์žฅํ•ด๋†“๊ธฐ

const letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
const dictionary = letters.reduce((d, a, i) => ((d[a] = i + 1), d), {});


๐Ÿ… ์•„์Šคํ‚ค์ฝ”๋“œ ๋งต ๋งŒ๋“ค๊ธฐ

const dictionary = [...new Array(128)].reduce((acc, _, index) => {
  return { ...acc, [+index]: 0 };
}, {});
for (let i = 0; i < m; i++) {
  dictionary[t[i].charCodeAt(0)]++;
}

ํ˜น์€ ์ผ๋ฐ˜ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค๊ณ  0 ์œผ๋กœ fill ํ•ด๋„ ok



๐Ÿ… 2์ฐจ์› ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ

const matrix = new Array(N + 1).fill(INF).map(() => new Array(N + 1).fill(INF));



๐Ÿ… 2์ฐจ์› ๋ฐฐ์—ด 1์ฐจ์› ๋ฐฐ์—ด๋กœ ํ’€๊ธฐ

const newArr = [].concat(...twoDimesionArr);



๐Ÿ… ๋ฌธ์ž์—ด ๋ถ€๋ถ„ ๊ฐ€์ ธ์˜ค๊ธฐ

  • ์ฒซ๋ฒˆ์งธ ์ธ์ž : ์‹œ์ž‘ํ•˜๋Š” ์ธ๋ฑ์Šค
  • ๋‘๋ฒˆ์งธ ์ธ์ž : ๋๋‚˜๋Š” ์ธ๋ฑ์Šค + 1
const str = "alogrithm";
console.log(str.substring(0,3)); // alo

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿณ JavaScript Algorithm's Recipes

๐Ÿ… [๋ฐฐ์—ด] ํˆฌํฌ์ธํ„ฐ

๋ฐฐ์—ด์— ์ ‘๊ทผํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ธ๋‹ค. ํŠนํžˆ๋‚˜ ๋ฐฐ์—ด ๋‚ด๋ถ€์˜ ์š”์†Œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ๋„ ์•ˆ์žก์•„๋จน๊ณ  ์•„์ฃผ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ผ ์ˆ˜ ์žˆ๋‹ค

  • 1์ฐจ์› ๋ฐฐ์—ด์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€๋ฆฌ์ผœ ์กฐ์ž‘์„ ํ•œ๋‹ค.
  • ์•„๋ž˜ ์˜ˆ์‹œ๋Š” ๋ฐฐ์—ด nums์— ์กด์žฌํ•˜๋Š” 0์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜์—ฌ ๋ฐฐ์—ด์˜ ๋งจ ๋’ค๋กœ ๋ณด๋‚ด๋Š” ๋ฌธ์ œ์ด๋‹ค.
var moveZeroes = function (nums) {
  let i = 0;
  for (let j = 0; j < nums.length; j++) {
    if (nums[j] !== 0) {
      nums[i] = nums[j];
      i++;
    }
  }
  while (i < nums.length) {
    nums[i] = 0;
    i++;
  }
};


๐Ÿ… [๋ฐฐ์—ด] ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ

๋ฐฐ์—ด ๋‚ด๋ถ€์—์„œ ์„œ๋ธŒ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์—ฐ์‚ฐ์„ ํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค

  • ๋ฐฐ์—ด A ์—์„œ ๊ธธ์ด N ์˜ ์„œ๋ธŒ๋ฐฐ์—ด์„ ๋ชจ๋‘ ํƒ์ƒ‰ํ•ด์•ผ ํ•  ๋•Œ, ์ผ์ผ์ด ๋‹ค ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด๋‚˜ ๋น„ํšจ์œจ์ ์ด๋‹ค ์™œ๋ƒํ•˜๋ฉด, ์„œ๋ธŒ๋ฐฐ์—ด๋“ค์€ ์„œ๋กœ ๊ฒน์น˜๊ฒŒ ๋˜๊ณ , ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์„œ๋ธŒ ๋ฐฐ์—ด ๋ผ๋ฆฌ ๊ณตํ†ต์š”์†Œ๊ฐ€ ๋ถ„๋ช…ํžˆ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค
  • ๊ทธ๋ฆฌ๊ณ  ์ด ๊ณตํ†ต์š”์†Œ๋Š”, ์ด์ „ ์„œ๋ธŒ๋ฐฐ์—ด์˜ ๋งจ ์ฒซ ์š”์†Œ์™€, ์ƒˆ๋กœ์šด ์„œ๋ธŒ๋ฐฐ์—ด์˜ ๋งจ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ์ œ์™ธํ•œ ๋ถ€๋ถ„์— ํ•ด๋‹นํ•œ๋‹ค.

// ๊ธธ์ด๊ฐ€ n ์ธ ์„œ๋ธŒ๋ฐฐ์—ด์˜ ํ•ฉ์„ ์ €์žฅํ•ด๋†“์€ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค
const slidingWindow = function (arr, n) {
  let startIndex = 0;
  let results = [];
  let length = arr.length;
  let sum = 0;
  for (let i = 0; i < length; i++) {
    if (i - startIndex === n) {
      // ์„œ๋ธŒ ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ n ์ด ๋˜์—ˆ์„ ๊ฒฝ์šฐ
      results.push(sum); // ๊ตฌํ•ด๋†“์€ sum์„ push ํ•ด์ฃผ๊ณ 
      sum -= arr[startIndex]; // sum์—์„œ ์ด์ „ ์„œ๋ธŒ๋ฐฐ์—ด์˜ ๋งจ ์•ž ์š”์†Œ ๊ฐ’์„ ์‚ญ์ œํ•œ๋‹ค
      startIndex = i; // startIndex๋ฅผ ๋ฐ”๊พธ์–ด์ค€๋‹ค.
    } else {
      sum += arr[i]; // ์„œ๋ธŒ๋ฐฐ์—ด ํฌ๊ธฐ ๋”ํ•˜๊ธฐ
    }
  }
  return results;
};


๐Ÿ… [๋ฐฐ์—ด / ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ] Floyd์˜ ํ† ๋ผ์™€ ๊ฑฐ๋ถ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜

์‚ฌ์ดํด ๋””ํ…์…˜, ์ฆ‰ ์ฃผ์–ด์ง„ ๋ฐฐ์—ด ํ˜น์€ ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ์— ์‚ฌ์ดํด์ด ์กด์žฌํ•˜๋Š”์ง€ / ์‚ฌ์ดํด์˜ ์‹œ์ž‘ ์œ„์น˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋‹ค.

  • ํˆฌํฌ์ธํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹ฌํ™”๋ฒ„์ „์œผ๋กœ, ํ† ๋ผ ํฌ์ธํ„ฐ๋Š” ๋‘์นธ์”ฉ ์ด๋™ํ•˜๊ณ  ๊ฑฐ๋ถ์ด ํฌ์ธํ„ฐ๋Š” ํ•œ์นธ ์”ฉ ์ด๋™ํ•œ๋‹ค.
  • ์ด๋Ÿฌ๋‹ค๊ฐ€ ํ† ๋ผ์™€ ๊ฑฐ๋ถ์ด๊ฐ€ ์„œ๋กœ ์œ„์น˜๊ฐ€ ๋ฐ”๋€Œ๊ฒŒ ๋˜๊ณ  (์ฒ˜์Œ์—๋Š” ๊ฑฐ๋ถ์ด -> ํ† ๋ผ ์˜€์ง€๋งŒ ๊ณ„์† ๊ฑฐ๋“ญํ•˜๋‹ค๋ณด๋ฉด ํ† ๋ผ --> ๊ฑฐ๋ถ์ด ์ธ ์ƒํ™ฉ๊นŒ์ง€ ์˜จ๋‹ค. ์™œ๋ƒ? ์‚ฌ์ดํด์ด ์žˆ์œผ๋‹ˆ๊นŒ. ์—ฌ๊ธฐ์„œ ํ† ๋ผ๊ฐ€ ๋จผ์ € null์— ๋„๋‹ฌํ•˜๋ฉด ์‚ฌ์ดํด์ด ์—†๋Š” ๊ฒƒ์ด๋‹ค) ๋งˆ์ง€๋ง‰์œผ๋กœ ํ† ๋ผ์™€ ๊ฑฐ๋ถ์ด๊ฐ€ ๋งŒ๋‚˜๊ฒŒ ๋˜๋ฉด, ์‚ฌ์ดํด์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‚ฌ์‹ค ํ† ๋ผ์™€ ๊ฑฐ๋ถ์ด์˜ ์ˆœ์„œ๊ฐ€ ๋’ค๋ฐ”๋€” ๋•Œ๊ฐ€ ๋ฐ”๋กœ ์‚ฌ์ดํด์ด ์ตœ์ดˆ๋กœ ๋ฐœ๊ฒฌ ๋  ๋•Œ์ธ๋ฐ, ์ด ๋•Œ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ๊ฒฝ์šฐ ์ˆœ์„œ๋ฅผ ๊ฒ€์ฆํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ํ† ๋ผ์™€ ๊ฑฐ๋ถ์ด์˜ ์œ„์น˜๊ฐ€ ๊ฐ™์•„์งˆ ๋•Œ ๊นŒ์ง€ ์—ฐ์‚ฐ์„ ๋” ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ •๋ง ์‚ฌ์ดํด์ด ์žˆ๋‹ค๊ณ  ํ•ด์„œ ๋‘์นธ์”ฉ ์›€์ง์ด๋Š” ํ† ๋ผ์™€ ํ•œ์นธ์”ฉ ์›€์ง์ด๋Š” ๊ฑฐ๋ถ์ด๊ฐ€ ๋งŒ๋‚  ์ˆ˜ ์žˆ๋‚˜ ? ์•ˆ๋งŒ๋‚  ์ˆ˜๋„ ์žˆ์ง€ ์•Š์„๊นŒ?

  • ์‚ฌ์ดํด์ด ์žˆ์„ ๊ฒฝ์šฐ๋Š” ๊ผญ ํ† ๋ผ์™€ ๊ฑฐ๋ถ์ด์˜ ์œ„์น˜๊ฐ€ ๋’ค๋ฐ”๋€Œ๊ฒŒ ๋˜๊ณ , (ํ† ๋ผ๊ฐ€ ์‚ฌ์ดํด์„ ๋”ฐ๋ผ์„œ ๊ฐ€๊ฒŒ ๋˜๋ฏ€๋กœ..) ๋’ค๋ฐ”๋€ ํ›„ ๋ถ€ํ„ฐ, ํ† ๋ผ์™€ ๊ฑฐ๋ถ์ด์˜ ์ฐจ์ด๋Š” 1 ์”ฉ ๊ฐ์†Œํ•˜๊ฒŒ ๋œ๋‹ค. (2 -> 1 - > 0 ) ๊ทธ๋Ÿฌ๋ฉด ๋‹น์—ฐํžˆ ์ฐจ์ด๊ฐ€ 0๊นŒ์ง€๋„ ๊ฐ์†Œํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๋‘˜์€ ๊ผญ ๋งŒ๋‚˜๊ฒŒ ๋˜์–ด์žˆ๋‹ค!
  • ์˜คํ•ดํ–์ง€ ๋ง์•„์•ผ ํ•  ๊ฒƒ์ด, ํ† ๋ผ์™€ ๊ฑฐ๋ถ์ด๊ฐ€ ๋งŒ๋‚˜๋Š” ์ง€์ ์ด ์‚ฌ์ดํด์„ ์ฆ๋ช…ํ•˜๋Š” ์ง€์ ์€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ํ† ๋ผ์™€ ๊ฑฐ๋ถ์ด๊ฐ€ ๋งŒ๋‚œ๋‹ค๋Š” ์‚ฌ์‹ค ๋งŒ์ด ์‚ฌ์ดํด์„ ์ฆ๋ช…ํ•œ๋‹ค.
var hasCycle = function (head) {
  if (!head) return false;

  let slow = head;
  let fast = head.next;

  while (slow !== fast) {
    if (fast === null || fast.next === null) return false;
    slow = slow.next;
    fast = fast.next.next;
  }

  return true;
};

์‚ฌ์ดํด ์‹œ์ž‘์ 

  • ์‚ฌ์ดํด์˜ ์‹œ์ž‘์ ์€๊ฑฐ๋ถ์ด๊ฐ€ ํ† ๋ผ๋ฅผ ์ฒ˜์Œ ์•ž์ง€๋ฅด๊ฒŒ ๋˜์—ˆ์„ ๋•Œ ํ† ๋ผ์˜ ์œ„์น˜๊ฐ€ ๋œ๋‹ค.

๐Ÿ… [ํƒ์ƒ‰] Binary Search, Lower bound and Upper bound

Binary Search - ์ •๋ ฌ๋œ ์ž๋ฃŒ์—์„œ ํŠน์ • ๊ฐ’์„ ์ฐพ์•„์•ผ ํ•  ๊ฒฝ์šฐ

  • ์ •๋ ฌ๋˜์–ด์žˆ์„ ๊ฒฝ์šฐ์—๋Š” ์ด๋ถ„ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ๊ฐ’์„ O(log n) ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
function binarySearch(array, target, length) {
  let start = 0;
  let end = length - 1;
  while (start <= end) {
    let mid = start + Math.floor((end - start) / 2);
    if (array[mid] === target) {
      return mid;
    } else if (array[mid] > target) {
      end = mid - 1;
    } else {
      start = mid + 1;
    }
  }
  return -1;
}

LowerBound - ์ •๋ ฌ๋œ ์ž๋ฃŒ์—์„œ target ์ด์ƒ์ด ์ฒ˜์Œ ๋‚˜์˜ค๋Š” ์œ„์น˜๋ฅผ ์ฐพ์•„์ค€๋‹ค.

  • ์ด๋ถ„ํƒ์ƒ‰์„ ์‘์šฉํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.
function getLowerBound(array, target, length) {
  let low = 0;
  let high = length;
  while (low < high) {
    let mid = low + Math.floor((high - low) / 2);
    if (array[mid] < target) {
      low = mid + 1;
    } else {
      high = mid;
    }
  }
  return low;
}

UpperBound - ์ •๋ ฌ๋œ ์ž๋ฃŒ์—์„œ target ์„ ์ดˆ๊ณผํ•œ ๊ฐ’์ด ์ฒ˜์Œ ๋‚˜์˜ค๋Š” ์œ„์น˜๋ฅผ ์ฐพ์•„์ค€๋‹ค.

function getUpperBound(array, target, length) {
  let low = 0;
  let high = length;
  while (low < high) {
    let mid = low + Math.floor((high - low) / 2);
    if (array[mid] <= target) {
      low = mid + 1;
    } else {
      high = mid;
    }
  }
  return high;
}