js algorithm - Lee-hyuna/33-js-concepts-kr GitHub Wiki

JS: μ•Œκ³ λ¦¬μ¦˜ 인터뷰

원문: JS: Interview Algorithm

1. μ†Œμˆ˜ 검사

질문 : μ†Œμˆ˜λ₯Ό μ–΄λ–»κ²Œ 확인 ν•  것인가?

λ‹΅ : μ†Œμˆ˜λŠ” 1κ³Ό 1둜만 λ‚˜λˆŒ 수 μžˆλ‹€. λ”°λΌμ„œ while 루프λ₯Ό μ‹€ν–‰ν•˜κ³  1μ”© μ¦κ°€μ‹œν‚¨λ‹€. (μ½”λ“œ 예제λ₯Ό μ°Έκ³ . 이해가 μ•ˆλ˜λ©΄ μžλ°” 슀크립트 κΈ°λ³Έ 사항을 λ°°μ›Œμ•Όν•œλ‹€.)

function isPrime(n){
	var divisor = 2;
	
	while (n > divisor){
		if(n % divisor == 0) {
			return  false;
		}  else 
			divisor++; 
	}  
	return  true;
} 

> isPrime(137); // true 
> isPrime(237); // false

λ©΄μ ‘κ΄€ : 더 λ‚˜μ€ 방법은 μ—†λ‚˜?

λ‹΅λ³€: λ‚˜λˆ—μˆ˜λŠ” ν•œ λ²ˆμ— 1 μ”© μ¦κ°€ν•œλ‹€. 3 이후에 2λ₯Ό μ¦κ°€μ‹œν‚¬ 수 μžˆλ‹€. μˆ«μžκ°€ 짝수둜 λ‚˜λˆŒ 수 있으면 2둜 λ‚˜λˆŒ 수 μžˆλ‹€.

μΆ”κ°€ : 제수λ₯Ό μˆ«μžκΉŒμ§€ 늘릴 ν•„μš”κ°€μ—†λŠ” 경우. 훨씬 일찍 멈좜 수 μžˆλ‹€.

2. μ†ŒμΈμˆ˜ (인수 쀑에 μ†Œμˆ˜μΈ 수)

질문 : 숫자의 λͺ¨λ“  μ†ŒμΈμˆ˜μ–΄λ–»κ²Œ 찾을 수 μžˆλ‚˜?

λ‹΅ : while 루프λ₯Ό μ‹€ν–‰ν•˜μž. 2둜 λ‚˜λˆ„κΈ° μ‹œμž‘ν•˜κ³  λ‚˜λˆŒ μˆ˜μ—†λŠ” 경우 urκ°€ λ‚˜μ˜¬ λ•ŒκΉŒμ§€ λ‚˜λˆ—μˆ˜λ₯Ό λŠ˜λ¦°λ‹€.

function primeFactors(n){
	var factors = [],
		divisor = 2;
		
	while(n>2){
		if(n % divisor == 0){
			factors.push(divisor);
			n= n/ divisor;
		} else {
			divisor++;
		}
	}
	return factors;
} 

> primeFactors(69); // [3, 23]

λ©΄μ ‘κ΄€ : λŸ°νƒ€μž„ λ³΅μž‘μ„±μ€ 무엇인가? 이것을 더 μ’‹κ²Œ λ§Œλ“€ 수 μžˆλ‚˜?

λ‹΅λ³€: 이것은 O (n)μž…λ‹ˆλ‹€. λ‚˜λˆ—μˆ˜κ°€ 3μ—μ„œ λΆ€ν„° 2둜 λ‚˜λˆ μ§€λŠ” λ‚˜λˆ—μˆ˜λ‘œ 증가할 수 μžˆλ‹€. μˆ«μžκ°€ 짝수둜 λ‚˜λˆŒ 수 있으면 2둜 λ‚˜λˆŒ 수 있기 λ•Œλ¬Έμ— 짝수둜 λ‚˜λˆŒ ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. κ²Œλ‹€κ°€, κ·Έ κ°€μΉ˜μ˜ μ ˆλ°˜λ³΄λ‹€ 큰 인자λ₯Ό 가지지 μ•Šμ„ 것이닀. λ³΅μž‘ν•œ κ°œλ…μ„ μ›ν•œλ‹€λ©΄ λ³΅μž‘ν•œ κ°œλ…μœΌλ‘œ μ‚¬μš©ν•˜λΌ

3. ν”Όλ³΄λ‚˜μΉ˜

질문 : n 번째 ν”Όλ³΄λ‚˜μΉ˜ μˆ«μžλŠ” μ–΄λ–»κ²Œ μ–»λŠ”κ°€?

λ‹΅ : 배열을 λ§Œλ“€κ³  λ°˜λ³΅λΆ€ν„° μ‹œμž‘ν•œλ‹€.

ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μ€ μ‹ μž…μ—κ²Œ κ°€μž₯ μΈκΈ°μžˆλŠ” 인터뷰 질문 쀑 ν•˜λ‚˜μ΄λ‹€. λ”°λΌμ„œ μ•Œμ•„μ•Όν•œλ‹€.

μ‹œλ„ 1


function fibonacci(n){
  var fibo = [0, 1];
  
  if (n <= 2) return 1;

  for (var i = 2; i <=n; i++ ){
   fibo[i] = fibo[i-1] + fibo[i-2];
  }

 return fibo[n];
} 

> fibonacci(12);
  = 144       

λ©΄μ ‘κ΄€ : 런 νƒ€μž„ λ³΅μž‘λ„λŠ” μ–΄λ–»κ²Œ λ˜λ‚˜?

λ‹΅λ³€: O (n)

λ©΄μ ‘κ΄€ : μž¬κ·€ 적으둜 λ§Œλ“€ 수 μžˆλ‚˜?

μ‹œλ„ 2


function fibonacci(n){
  if(n<=1)
    return n;
  else
    return fibonacci(n-1) + fibonacci (n-2);  
}

> fibonacci(12);
  = 144
         

λ©΄μ ‘κ΄€ : λŸ°νƒ€μž„ λ³΅μž‘λ„λŠ” μ–΄λ–»κ²Œ λ˜λ‚˜?

λ‹΅λ³€: O (2 n ). λ³΅μž‘μ„±μ— λŒ€ν•œ μ„ΈλΆ€ 사항

4. μ΅œλŒ€ κ³΅μ•½μˆ˜

질문 : 두 숫자의 μ΅œλŒ€ κ³΅μ•½μˆ˜λ₯Ό μ–΄λ–»κ²Œ 찾을 수 μžˆλ‚˜?


function greatestCommonDivisor(a, b){
  var divisor = 2, 
      greatestDivisor = 1;

  //if u pass a -ve number this will not work. fix it dude!!
  if (a < 2 || b < 2)
     return 1;
  
  while(a >= divisor && b >= divisor){
   if(a %divisor == 0 && b% divisor ==0){
      greatestDivisor = divisor;      
    }
   divisor++;
  }
  return greatestDivisor;
}

> greatestCommonDivisor(14, 21);
  =7 
> greatestCommonDivisor(69, 169);
  = 1

        

멋진 μ•Œκ³ λ¦¬μ¦˜

λ―Έμ•ˆν•˜λ‹€. μ„€λͺ… ν•  수 μ—†λ‹€. λ‚˜ μžμ‹ λ„ 80% 정도 μ΄ν•΄ν•˜μ§€ λͺ»ν•˜κΈ° λ•Œλ¬Έμ—... μ•Œκ³ λ¦¬μ¦˜ 뢄석 강사가 이것에 λŒ€ν•΄ λ§ν•΄μ„œ κ·Έλƒ₯ μ“΄κ±°λ‹€.


function greatestCommonDivisor(a, b){
   if(b == 0)
     return a;
   else 
     return greatestCommonDivisor(b, a%b);
}
        

μ°Έκ³  : λ‡Œλ₯Ό μ‚¬μš©ν•˜μ—¬ 이해해라.

5. 쀑볡 제거

질문 : λ°°μ—΄μ—μ„œ 쀑볡 μš”μ†Œλ₯Ό μ–΄λ–»κ²Œ 제거 ν•  것인가?

λ‹΅λ³€ : 반볡 루프λ₯Ό μ‹œμž‘ν•˜κ³  객체 / κ΄€λ ¨ 배열을 μœ μ§€ν•©λ‹ˆλ‹€. 처음으둜 μš”μ†Œλ₯Ό 찾으면 κ·Έ 값을 true둜 ν•œλ‹€.(μš”μ†Œκ°€ ν•œ 번 μΆ”κ°€λ˜μ—ˆμŒμ„ λ €μ€€λ‹€). μ‘΄μž¬ν•˜λŠ” κ°μ²΄μ—μ„œ μš”μ†Œλ₯Ό 찾으면 λ°˜ν™˜ 배열에 μ‚½μž…ν•˜μ§€ μ•ŠλŠ”λ‹€.


function removeDuplicate(arr){
  var exists ={},
      outArr = [], 
      elm;

  for(var i =0; i<arr.length; i++){
    elm = arr[i];
    if(!exists[elm]){
      outArr.push(elm);
      exists[elm] = true;
   }
  }
  return outArr;
}

> removeDuplicate([1,3,3,3,1,5,6,7,8,1]);
  = [1, 3, 5, 6, 7, 8]
        

6. μ •λ ¬ 된 두 배열을 병합

질문 : 두 개의 μ •λ ¬ 된 배열을 μ–΄λ–»κ²Œ 병합 ν•  것인가?

λ‹΅ : 각 배열에 λŒ€ν•œ 포인터λ₯Ό μœ μ§€(μ½”λ“œλ₯Ό 읽고 이것에 μ£Όμ˜ν•˜λΌ)


function mergeSortedArray(a, b){
  var merged = [], 
      aElm = a[0],
      bElm = b[0],
      i = 1,
      j = 1;
  
  if(a.length ==0)
    return b;
  if(b.length ==0)
    return a;
  /* 
  if aElm or bElm exists we will insert to merged array
  (will go inside while loop)
   to insert: aElm exists and bElm doesn't exists
             or both exists and aElm < bElm
    this is the critical part of the example            
  */
  while(aElm || bElm){
   if((aElm && !bElm) || aElm < bElm){
     merged.push(aElm);
     aElm = a[i++];
   }   
   else {
     merged.push(bElm);
     bElm = b[j++];
   }
  }
  return merged;
}

> mergeSortedArray([2,5,6,9], [1,2,3,29]);
 = [1, 2, 2, 3, 5, 6, 9, 29]
        

7. μž„μ‹œ λ³€μˆ˜ μ—†λŠ” 숫자 κ΅μ²΄ν•˜κΈ°

질문 : μž„μ‹œ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  두 숫자λ₯Ό μ–΄λ–»κ²Œ 바꿀것 인가?

λ‹΅ : μƒκ°ν•˜λŠ” 것 처럼 μ‹œκ°„μ„ λŒμ–΄λΌ. 닡은 μ•Œκ³  μžˆμ§€λ§Œ μƒκ°ν•˜λŠ” κ²ƒμ²˜λŸΌ ν–‰λ™ν•˜κ³  닡변에 μ‹œκ°„μ„ 내라.


function swapNumb(a, b){
  console.log('before swap: ','a: ', a, 'b: ', b);
  b = b - a;
  a = a + b;
  b = a - b;
  console.log('after swap: ','a: ', a, 'b: ', b);  
}

> swapNumb(2, 3);
   = before swap:  a:  2 b:  3
   = after swap:  a:  3 b:  2 
        

λΉ„νŠΈ μ‘°μž‘ : λ―Έμ•ˆν•΄. μ„€λͺ… ν•  수 μ—†λ‹€. Kinjal DaveλŠ”μ΄ λ₯Ό μ΄ν•΄ν•˜κΈ°μœ„ν•œ 논리적 μ—°κ²° 을 μ œμ•ˆ ν–ˆλ‹€.


function swapNumb(a, b){
  console.log("a: " + a + " and b: " + b);
  a = a ^ b;
  b = a ^ b;
  a = a ^ b;
  console.log("a: " + a + " and b: " + b);
}

> swapNumb(2, 3);
  = a: 2 and b: 3
  = a: 3 and b: 2
        

8. λ¬Έμžμ—΄ 뒀집기

질문 : λ¬Έμžμ—΄μ„ μ–΄λ–»κ²Œ 뒀집을 것인가?

λ‹΅ : λ¬Έμžμ—΄μ„ λ°˜λ³΅ν•˜κ³  문자λ₯Ό μƒˆ λ¬Έμžμ—΄λ‘œ μ—°κ²°ν•˜λ©΄ λœλ‹€.

μ‹œλ„ 1


function reverse(str){
  var rtnStr = '';
  for(var i = str.length-1; i>=0;i--){
    rtnStr += str[i];
  }
  return rtnStr;
}

> reverse('you are a nice dude');
  = "edud ecin a era uoy"
        

λ©΄μ ‘κ΄€ : μ΅œμ‹  λΈŒλΌμš°μ €μ—μ„œλŠ” μ €λŸ¬ν•œ 방식이 잘 λ™μž‘ν•˜μ§€λ§Œ IE8κ³Ό 같은 였래된 λΈŒλΌμš°μ €μ—μ„œλŠ” λŠλ¦¬λ‹€. λ‹€λ₯Έ 방법이 μžˆλŠ”κ°€?

**λ‹΅ : ** 물둠이닀. 배열을 μ‚¬μš©ν•΄ 검사λ₯Ό μΆ”κ°€ ν•  수 μžˆλ‹€. λ¬Έμžμ—΄μ΄ nullμ΄κ±°λ‚˜ λ¬Έμžμ—΄μ΄ μ•„λ‹Œ 경우 μ‹€νŒ¨ν•œλ‹€. νƒ€μž… 체크도 ν•œλ‹€. 이 배열을 μ‚¬μš©ν•˜λŠ” 것은 일뢀 μ„œλ²„ μΈ‘ μ–Έμ–΄μ—μ„œ λ¬Έμžμ—΄ 버퍼λ₯Ό μ‚¬μš©ν•˜λŠ” 것과 κ°™λ‹€.

μ‹œλ„ 2


function reverse(str){
  var rtnStr = [];
  if(!str || typeof str != 'string' || str.length < 2 ) return str;
  
  for(var i = str.length-1; i>=0;i--){
    rtnStr.push(str[i]);
  }
  return rtnStr.join('');
}
        

λ©΄μ ‘κ΄€ : λŸ°νƒ€μž„ λ³΅μž‘λ„λŠ” μ–΄λ–»κ²Œ λ˜λ‚˜?

λ‹΅λ³€: O (n)

λ©΄μ ‘κ΄€ : 더 κ°œμ„ μ΄ κ°€λŠ₯ν•œκ°€?

λ‹΅λ³€: μƒ‰μΈμ˜ μ ˆλ°˜μ„ 반볡 ν•˜λ©΄ 쑰금 μ ˆμ•½ ν•  수 μžˆμ„ 것이닀.

3 번 μ‹œλ„


function reverse(str) {
  str = str.split('');
  var len = str.length,
      halfIndex = Math.floor(len / 2) - 1,
      revStr;
  for (var i = 0; i <= halfIndex; i++) {
    revStr = str[len - i - 1];
    str[len - i - 1] = str[i];
    str[i] = revStr;
  }
  return str.join('');
}
        

λ©΄μ ‘κ΄€ : 이 것은 νš¨κ³Όκ°€ μžˆμ§€λ§Œ μž¬κ·€ 적으둠 κ°€λŠ₯ν•œκ°€?

**λ‹΅λ³€: ** 물둠이닀.

4 번 μ‹œλ„


function reverse (str) {
    if (str === "") {
        return "";
    } else {
        return reverse(str.substr(1)) + str.charAt(0);
    }
}
        

5 번 μ‹œλ„

λ©΄μ ‘κ΄€ : μ’€ 더 κΉ”λ”ν•˜κ²Œ ν•  수 μžˆλ‚˜?

λ‹΅λ³€: 예.


function reverse(str){
  if(!str || str.length <2) return str;
  
  return str.split('').reverse().join('');
}
        

6 번 μ‹œλ„

질문 : λ¬Έμžμ—΄ ν™•μž₯으둜 λ¦¬λ²„μŠ€ ν•¨μˆ˜λ₯Ό λ§Œλ“€ 수 μžˆλ‚˜?

λ‹΅λ³€ : 이 ν•¨μˆ˜λ₯Ό String.prototype에 μΆ”κ°€ν•΄μ•Όν•˜κ³  str을 맀개 λ³€μˆ˜λ‘œ μ‚¬μš©ν•œλ‹€.


String.prototype.reverse = function (){
  if(!this || this.length <2) return this;
  
  return this.split('').reverse().join('');
}

> 'abc'.reverse();
  = 'cba'
        

9. 단어 뒀집기

질문 : λ¬Έμž₯μ—μ„œ 단어λ₯Ό μ–΄λ–»κ²Œ 뒀집을 것인가?

λ‹΅ : 곡백이 μ—¬λŸ¬ 개 μžˆλ‚˜ ν™•μΈν•œλ‹€.


//have a tailing white space
//fix this later
//now i m sleepy
function reverseWords(str){
 var rev = [], 
     wordLen = 0;
 for(var i = str.length-1; i>=0; i--){
   if(str[i]==' ' || i==0){
     rev.push(str.substr(i,wordLen+1));
     wordLen = 0;
   }
   else
     wordLen++;
 }
 return rev.join(' ');
}
        

λ‚΄μž₯ λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•œ λΉ λ₯Έ μ†”λ£¨μ…˜ :


function reverseWords(str){
  return str.split(' ').reverse();
}
        

10. μœ„μΉ˜ 뒀집기

질문 : "I am the good boy""와 같은 λ¬Έμž₯이 μžˆλ‹€λ©΄. "I ma eht doog yob"을 μ–΄λ–»κ²Œ λ§Œλ“€ 수 μžˆλ‚˜? λ‹¨μ–΄λŠ” μ œμžλ¦¬μ— μžˆμ§€λ§Œ 뒀집은 μƒνƒœμ΄λ‹€.

λ‹΅ : μ΄λ ‡κ²Œ ν•˜λ €λ©΄ λ¬Έμžμ—΄ λ°˜μ „κ³Ό 단어 λ°˜μ „μ„ λͺ¨λ‘ μˆ˜ν–‰ν•΄μ•Ό ν•œλ‹€.


function reverseInPlace(str){
  return str.split(' ').reverse().join(' ').split('').reverse().join('');
}

> reverseInPlace('I am the good boy');
 = "I ma eht doog yob"
        

λ©΄μ ‘κ΄€ : μ’‹λ‹€. reverse() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  ν•  수 μžˆλ‚˜?

λ‹΅λ³€: λ­λΌκ΅¬μš”?


//sum two methods.
//you can simply split words by ' '
//and for each words, call reverse function
//put reverse in a separate function


//if u cant do this, 
//have a glass of water, and sleep
        

11. 첫 번째 λΉ„ 반볡 문자

질문 : λ¬Έμžμ—΄μ—μ„œ 첫 번째 λΉ„ 반볡 문자λ₯Ό μ–΄λ–»κ²Œ 찾을 수 μžˆλ‚˜?

λ‹΅λ³€ : 쑰건이 μ’€ 더 ν•„μš”ν•˜λ‹€.

μ„€λͺ… : λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•©λ‹ˆκΉŒ?

λ©΄μ ‘κ΄€ : 면접관은 거절 ν•  수 μžˆλ‹€.

λ‹΅λ³€ : 맀우 κΈ΄ λ¬Έμžμ—΄μΈκ°€? μ•„λ‹ˆλ©΄ λͺ‡ 백쀄인가?

λ©΄μ ‘κ΄€ : μ™œ μ€‘μš”ν•œκ°€?

**λ‹΅λ³€ :**예λ₯Ό λ“€μ–΄, λ§Œμ•½ 그것이 맀우 κΈ΄ λ¬Έμžμ—΄μ΄λΌλ©΄ 백만자λ₯Ό λ§ν•˜κ³ , 26개의 μ˜μ–΄ λ¬Έμžκ°€ 반볡되고 μžˆλŠ”μ§€ ν™•μΈν•˜κ³  μ‹Άλ‹€. 전체 λ¬Έμžμ—΄μ„ μˆœν™˜ν•˜λŠ” 것 외에 λͺ¨λ“  λ¬Έμžκ°€ 200μžλ§ˆλ‹€ μ€‘λ³΅λ˜λŠ”μ§€ μ—¬λΆ€λ₯Ό 확인할 수 μžˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ 계산 μ‹œκ°„μ΄ μ ˆμ•½λœλ‹€.

λ©΄μ ‘κ΄€ : λ¬Έμž₯은 "the quick brown fox jumps then quickly blow air" 이거닀.


function firstNonRepeatChar(str){
  var len = str.length,
      char, 
      charCount = {};
  for(var i =0; i<len; i++){
    char = str[i];
    if(charCount[char]){
      charCount[char]++;
    }
    else
      charCount[char] = 1;
  }
  for (var j in charCount){
    if (charCount[j]==1)
       return j;
  }
}  

>firstNonRepeatChar('the quick brown fox jumps then quickly blow air');
 = "f"
        

μ°Έκ³ : 이것은 ν•˜λ‚˜μ˜ λ¬Έμ œκ°€ μžˆλ‹€. for 루프가 μˆœμ„œλŒ€λ‘œ μ‹€ν–‰λœλ‹€λŠ” 보μž₯은 μ—†λ‹€.

12. 쀑볡 문자λ₯Ό 제거

질문 : λ¬Έμžμ—΄μ—μ„œ 쀑볡 문자λ₯Ό μ–΄λ–»κ²Œ μ œκ±°ν•˜λŠ”κ°€?

λ‹΅λ³€: 이것은 첫 번째 λΉ„ 반볡 λ¬Έμžμ™€ 맀우 μœ μ‚¬ν•˜λ‹€. λΉ„μŠ·ν•œ μ§ˆλ¬Έμ„ ν•˜λ©΄λœλ‹€. λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜λŠ”κ°€?

λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜λ©΄ 더 μ‰¬μ›Œμ§„λ‹€. κ΅¬λΆ„ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄. string.toLowercase()λ₯Ό μ‚¬μš©ν•˜μ—¬ 전체 λ¬Έμžμ—΄μ„ λ³€ν™˜ν•  수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ 그것을 μ’‹μ•„ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 리턴 λ¬Έμžμ—΄μ΄ 같은 κ²°κ³Όλ₯Ό 내지 μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€. κ·Έλž˜μ„œ


function removeDuplicateChar(str){
  var len = str.length,
      char, 
      charCount = {}, 
      newStr = [];
  for(var i =0; i<len; i++){
    char = str[i];
    if(charCount[char]){
      charCount[char]++;
    }
    else
      charCount[char] = 1;
  }
  for (var j in charCount){
    if (charCount[j]==1)
       newStr.push(j);
  }
  return newStr.join('');
}

> removeDuplicateChar('Learn more javascript dude');
  = "Lnmojvsciptu"
        

μ°Έκ³ : 이것은 ν•˜λ‚˜μ˜ λ¬Έμ œκ°€ μžˆλ‹€. for 루프가 μˆœμ„œλŒ€λ‘œ μ‹€ν–‰λœλ‹€λŠ” 보μž₯은 μ—†λ‹€.

13. 회문(palindrome) 확인

질문 : 단어가 회문인 것을 μ–΄λ–»κ²Œ 확인 ν•  것인가?

λ‹΅ : 단어λ₯Ό 뒀집어 이전 단어와 λ™μΌν•˜λ©΄ 회문이라 ν•œλ‹€.


function isPalindrome(str){
  var i, len = str.length;
  for(i =0; i<len/2; i++){
    if (str[i]!== str[len -1 -i])
       return false;
  }
  return true;
}

> isPalindrome('madam')
  = true
> isPalindrome('toyota')
  = false
        

λ˜λŠ” λ‚΄μž₯ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.


function checkPalindrom(str) {
    return str == str.split('').reverse().join('');
}
        

μœ μ‚¬ : λ¬Έμžμ—΄ O (n)이 μ‹œκ°„μ— 연속 회문 λ¬Έμžμ—΄μ΄ λ“€μ–΄ μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό μ°ΎλŠ”λ‹€. O (1) μ‹œκ°„ μ•ˆμ— 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμ„κΉŒ?

14. 5μ—μ„œ 7 μ‚¬μ΄μ˜ μž„μ˜μ˜ 수

질문 : 1μ—μ„œ 5 μ‚¬μ΄μ˜ λ‚œμˆ˜λ₯Ό μƒμ„±ν•˜λŠ” ν•¨μˆ˜κ°€ μžˆλ‹€λ©΄ κ·Έ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ–΄λ–»κ²Œ λ‚œμˆ˜λ₯Ό 1μ—μ„œ 7κΉŒμ§€ 생성 ν•  수 μžˆμ„κΉŒ?

λ‹΅ : 맀우 κ°„λ‹¨ν•˜λ‹€. 기본적인 μ‚°μˆ μ„ μƒκ°ν•˜λ©΄ 얻을 수 μžˆλ‹€.


function rand5(){
   return 1 + Math.random() * 4;
}

function rand7(){
  return 5 + rand5() / 5 * 2;
}
        

15. 빠진 번호 μ°ΎκΈ°

질문 : ν•˜λ‚˜μ˜ 숫자λ₯Ό μ œμ™Έν•˜κ³  1μ—μ„œ 100κΉŒμ§€μ˜ μ •λ ¬λ˜μ§€ μ•Šμ€ λ°°μ—΄μ—μ„œ 빠진 숫자λ₯Ό μ–΄λ–»κ²Œ 찾을 수 μžˆμ„κΉŒ?

μ„€λͺ… : 배열에 1-100의 숫자 배열이 μžˆλ‹€. λ°°μ—΄μ—μ„œ ν•˜λ‚˜μ˜ 숫자만 λˆ„λ½λ˜μ—ˆλ‹€. 배열은 μ •λ ¬λ˜μ§€ μ•Šμ•˜λ‹€. 빠진 숫자λ₯Ό 찾아라.

λ‹΅ : 생각을 많이 ν•˜λŠ” κ²ƒμ²˜λŸΌ ν–‰λ™ν•΄μ•Όν•œλ‹€. 그런 λ‹€μŒ 숫자 n = n * (n + 1) / 2의 합에 λŒ€ν•΄ 이야기 ν•œλ‹€.


function missingNumber(arr){
  var n = arr.length+1, 
  sum = 0,
  expectedSum = n* (n+1)/2;
  
  for(var i = 0, len = arr.length; i < len; i++){
    sum += arr[i];
  }
  
  return expectedSum - sum;
}

> missingNumber([5, 2, 6, 1, 3]);
  = 4
        

16. 2의 ν•©

질문 : μ •λ ¬λ˜μ§€ μ•Šμ€ λ°°μ—΄μ—μ„œ 주어진 μˆ«μžμ— ν•΄λ‹Ήν•˜λŠ” 두 개의 μˆ«μžκ°€ μžˆλŠ”μ§€ ν™•μΈν•˜λΌ.

λ‹΅ : μ„Έμƒμ—μ„œ κ°€μž₯ κ°„λ‹¨ν•œ 것. 이쀑루프λ₯Ό μ΄μš©ν•œλ‹€.


function sumFinder(arr, sum){
  var len = arr.length;
  
  for(var i =0; i<len-1; i++){  
     for(var j = i+1;j<len; j++){
        if (arr[i] + arr[j] == sum)
            return true;
     }
  }
  
  return false;
}

> sumFinder([6,4,3,2,1,7], 9);
  = true
> sumFinder([6,4,3,2,1,7], 2);
  = false
        

λ©΄μ ‘κ΄€ : 이 ν•¨μˆ˜μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” 무엇인가

λ‹΅λ³€: O (n 2 )

λ©΄μ ‘κ΄€ : 더 잘 λ§Œλ“€ 수 μžˆλ‚˜?

λ‹΅λ³€: 합계와 μš”μ†Œμ˜ 차이λ₯Ό μ €μž₯ν•  객체λ₯Ό κ°€μ§ˆ 수 μžˆλ‹€. 그런 λ‹€μŒ μƒˆ μš”μ†Œμ— λ„λ‹¬ν–ˆμ„ λ•Œ 차이가 κ°μ²΄λΌλŠ” 것을 μ•Œλ©΄ μ›ν•˜λŠ” ν•©κ³„κΉŒμ§€ 합이 λ˜λŠ” 쌍이 μžˆλ‹€.

μ‹œλ„ 2


function sumFinder(arr, sum){
  var differ = {}, 
      len = arr.length,
      substract;
  
  for(var i =0; i<len; i++){
     substract = sum - arr[i];

     if(differ[substract])
       return true;       
     else
       differ[arr[i]] = true;
  }
  
  return false;
}

> sumFinder([6,4,3,2,1,7], 9);
  = true
> sumFinder([6,4,3,2,1,7], 2);
  = false
        

λΉ„μŠ·ν•œ 문제 : λ°°μ—΄ μ—μ„œ 두 숫자의 μ΅œλŒ€μ°¨μ΄ λ₯Ό 찾아라

17. κ°€μž₯ 큰 합계

질문 : 두 μš”μ†Œ 쀑 κ°€μž₯ 큰 합계λ₯Ό μ–΄λ–»κ²Œ 찾을 수 μžˆλ‚˜?

λ‹΅ : 맀우 κ°„λ‹¨ν•˜λ‹€. 두 개의 κ°€μž₯ 큰 숫자λ₯Ό μ°Ύμ•„μ„œ κ·Έ 합계λ₯Ό λ°˜ν™˜ν•˜λ©΄ λœλ‹€.


function topSum(arr){
  
  var biggest = arr[0], 
      second = arr[1], 
      len = arr.length, 
      i = 2;

  if (len<2) return null;
  
  if (biggest<second){
    biggest = arr[1];
    second = arr[0];
  } 
  
  for(; i<len; i++){

   if(arr[i] > biggest){
      second = biggest;
      biggest = arr[i];
    }
   else if (arr[i]>second){
      second = arr[i];
   }
    
 }
 return biggest + second;
}
        

18. 0 μ„ΈκΈ°

질문 : 1 μ—μ„œ nκΉŒμ§€μ˜ 총 0의 κ°―μˆ˜λŠ”?

λ‹΅ : n = 50 인 경우 0의 μˆ˜λŠ” 11 (0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100)이닀. 100μ—λŠ” 두 개의 0이 μžˆμŠ΅λ‹ˆλ‹€. 이것은 κ°„λ‹¨ν•˜μ§€λ§Œ 쑰금 κΉŒλ‹€λ‘œμ›Œ 보인닀.

μ„€λͺ… : 1μ—μ„œ 50κΉŒμ§€μ˜ μˆ«μžκ°€ 있으면 값은 5μž…λ‹ˆλ‹€. 50을 10으둜 λ‚˜λˆˆ κ°’μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 값이 100이면 값은 11μž…λ‹ˆλ‹€. 100/10 = 10 및 10/10이 λœλ‹€. 그것이 (100, 200, 1000)κ³Ό 같은 ν•˜λ‚˜μ˜ 숫자둜 더 λ§Žμ€ 0을 μ–»λŠ” 방법이닀.


function countZero(n){
  var count = 0;
  while(n>0){
   count += Math.floor(n/10);
   n = n/10;
  }
  return count;
}

> countZero(2014);
  = 223
        

19. subString

질문 : λ¬Έμžμ—΄μ˜ λΆ€λΆ„ λ¬Έμžμ—΄μ„ μ–΄λ–»κ²Œ μΌμΉ˜μ‹œν‚¬ 수 μžˆλ‚˜?

λ‹΅λ³€ : λ¬Έμžμ—΄μ„ λ°˜λ³΅ν•˜λŠ” λ™μ•ˆ 포인터 (λ¬Έμžμ—΄κ³Ό ν•˜μœ„ λ¬Έμžμ—΄μ— λŒ€ν•œ 포인터)λ₯Ό μ‚¬μš©ν•œλ‹€. 그리고 초기 일치의 μ‹œμž‘ 색인을 보유 ν•  λ‹€λ₯Έ λ³€μˆ˜κ°€ μžˆλ‹€.


function subStringFinder(str, subStr){
  var idx = 0,
      i = 0,
      j = 0,
      len = str.length,
      subLen = subStr.length;

   for(; i<len; i++){
   
      if(str[i] == subStr[j])
         j++;
      else
         j = 0;
      
      //check starting point or a match   
      if(j == 0)
        idx = i;
      else if (j == subLen)
        return idx;
  }

  return -1;
}

> subStringFinder('abbcdabbbbbck', 'ab')
  = 0
> subStringFinder('abbcdabbbbbck', 'bck')
  = 9

//doesn't work for this one.
> subStringFinder('abbcdabbbbbck', 'bbbck')  
  = -1
            

질문 : λ§ˆμ§€λ§‰ 문제λ₯Ό μ–΄λ–»κ²Œ ν•΄κ²°ν•  수 μžˆλ‚˜?

λ‹΅ : 직접 해봐라..

20. μˆœμ—΄

질문 : λ¬Έμžμ—΄μ˜ λͺ¨λ“  μˆœμ—΄μ„ μ–΄λ–»κ²Œ λ§Œλ“€ 것인가?

λ‹΅ : 이것은 μ•Œκ³ λ¦¬μ¦˜μ— λŒ€ν•œ 지식 μˆ˜μ€€μ— 따라 μ–΄λ €μš΄ 일일 수 μžˆλ‹€.


function permutations(str){
var arr = str.split(''),
    len = arr.length, 
    perms = [],
    rest,
    picked,
    restPerms,
    next;

    if (len == 0)
        return [str];

    for (var i=0; i<len; i++)
    {
        rest = Object.create(arr);
        picked = rest.splice(i, 1);

        restPerms = permutations(rest.join(''));

       for (var j=0, jLen = restPerms.length; j< jLen; j++)
       {
           next = picked.concat(restPerms[j]);
           perms.push(next.join(''));
       }
    }
   return perms;
}
        

μ„€λͺ…:

  • 아이디어 : μ•„μ΄λ””μ–΄λŠ” 맀우 κ°„λ‹¨ν•˜λ‹€. λ¬Έμžμ—΄μ„ λ°°μ—΄λ‘œ λ³€ν™˜ν•œλ‹€. λ°°μ—΄μ—μ„œ ν•˜λ‚˜μ˜ 문자λ₯Ό μ„ νƒν•œ λ‹€μŒ λ‚˜λ¨Έμ§€ 문자λ₯Ό μΉ˜ν™˜ν•œλ‹€. λ‚˜λ¨Έμ§€ μΊλ¦­ν„°μ˜ μˆœμ—΄μ„ 얻은 ν›„, μš°λ¦¬λŠ” μ„ νƒν•œ 캐릭터와 각 캐릭터λ₯Ό μ—°κ²°ν•œλ‹€.
  • 1 단계 μš”μ†Œλ₯Ό 선택할 λ•Œ λ³€κ²½ν•˜μ§€ μ•Šλ„λ‘ 원본 배열을 λ¨Όμ € 볡사
  • 2 단계 spliceλ₯Ό μ‚¬μš©ν•˜μ—¬ 볡사 된 λ°°μ—΄μ—μ„œ μš”μ†Œλ₯Ό μ œκ±°ν•œλ‹€. spliceκ°€ λ°°μ—΄μ—μ„œ ν•­λͺ©μ„ μ œκ±°ν•˜κΈ° λ•Œλ¬Έμ— 배열을 λ³΅μ‚¬ν•œλ‹€. λ‹€μŒ λ°˜λ³΅μ—μ„œ μ„ νƒν•œ ν•­λͺ©μ΄ ν•„μš”ν•˜λ‹€.
  • 3 단계 [1,2,3,4] .splice (2,1)은 [3]을 λ°˜ν™˜ν•˜κ³  λ‚˜λ¨Έμ§€ λ°°μ—΄ = [1,2,4]
  • 4 단계 : μž¬κ·€ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 배열을 λ¬Έμžμ—΄λ‘œ μ „λ‹¬ν•˜μ—¬ λ‚˜λ¨Έμ§€ μš”μ†Œμ˜ μˆœμ—΄μ„ κ°€μ Έμ˜¨λ‹€.
  • 5 단계 λ§ˆμ§€λ§‰μœΌλ‘œ 각 + a permute (bc)와 같은 μ—°κ²°