'전체 글'에 해당되는 글 137건

  1. 2021.03.11 짐 나르기
  2. 2021.03.11 Number()함수
  3. 2021.03.11 바코드
  4. 2021.03.11 연결된 정점들
  5. 2021.03.11 인접 행렬 길찾기
  6. 2021.03.11 인접 행렬 생성하기
  7. 2021.03.11 알고리즘의 time complexity...
  8. 2021.02.26 Prototype in Javascript

짐 나르기

웹 개발/Algorithm 2021. 3. 11. 16:32
더보기

문제

김코딩과 박해커는 사무실 이사를 위해 짐을 미리 싸 둔 뒤, 짐을 넣을 박스를 사왔다. 박스를 사오고 보니 각 이사짐의 무게는 들쭉날쭉한 반면, 박스는 너무 작아서 한번에 최대 2개의 짐 밖에 넣을 수 없었고 무게 제한도 있었다.

예를 들어, 짐의 무게가 [70kg, 50kg, 80kg, 50kg]이고 박스의 무게 제한이 100kg이라면 2번째 짐과 4번째 짐은 같이 넣을 수 있지만 1번째 짐과 3번째 짐의 무게의 합은 150kg이므로 박스의 무게 제한을 초과하여 같이 넣을 수 없다.

박스를 최대한 적게 사용하여 모든 짐을 옮기려고 합니다.

짐의 무게를 담은 배열 stuff와 박스의 무게 제한 limit가 매개변수로 주어질 때, 모든 짐을 옮기기 위해 필요한 박스 개수의 최소값을 return 하도록 movingStuff 함수를 작성하세요.

입력

인자 1: stuff

  • Number 타입의 40 이상 240 이하의 자연수를 담은 배열
    • ex) [70, 50, 80, 50]

인자 2: limited

  • Number 타입의 40 이상 240 이하의 자연수

출력

  • Number 타입을 리턴해야 합니다.
  • 모든 짐을 옮기기 위해 필요한 박스 개수의 최솟값을 숫자로 반환합니다.

주의사항

  • 옮겨야 할 짐의 개수는 1개 이상 50,000개 이하입니다.
  • 박스의 무게 제한은 항상 짐의 무게 중 최대값보다 크게 주어지므로 짐을 나르지 못하는 경우는 없습니다.

입출력 예시

let output = movingStuff([70, 50, 80, 50], 100);
console.log(output); // 3

let output = movingStuff([60, 80, 120, 90, 130], 140);
console.log(output); // 4
function movingStuff(stuff, limit) {
  let lineUpArr = stuff.sort(function(a, b)  {
  if(a > b) return 1;
  if(a === b) return 0;
  if(a < b) return -1;
  })
  let count = 0;
  let checkObj = {}
  for(let i = 0; i < stuff.length; i++){
    checkObj[i] = true
  }
  // 모두 true인 객체
  for(let i = 0; i < lineUpArr.length; i++){
    if(checkObj[i]){
      for(let j = lineUpArr.length - 1; j >= 0; j--){           
      if(checkObj[i] && checkObj [j] && i !== j){
        if(lineUpArr[i] + lineUpArr[j] <= limit){
          checkObj[i] = false;
          checkObj[j] = false;
          count++
          break;
        } 
      }
      else{
        if(j === 0 && i !== j){
          checkObj[i] = false;
          count++
        }
      } 
    }
    }
    
  }
  return count
}

 

'웹 개발 > Algorithm' 카테고리의 다른 글

발표 순서  (0) 2021.03.11
금고를 털어라  (0) 2021.03.11
바코드  (0) 2021.03.11
연결된 정점들  (0) 2021.03.11
인접 행렬 길찾기  (0) 2021.03.11
:

Number()함수

웹 개발/Study 2021. 3. 11. 16:31

Number()함수가 큰 숫자를 다룰 때는 조심해야한다. 64비트 이상의 숫자 (18,446,744,073,709,551,615)를 다루게 될때 (거의 알고리즘에서 밖에 다루지 않겠지만...) 서로 다른 숫자를 같은 숫자로 인식하는 등 여러가지 문제점이 발생한다.

따라서 큰 숫자를 다룰때는 String 타입으로 변환 시킨 다음 비교를 하던지 하자!

'웹 개발 > Study' 카테고리의 다른 글

Promise 정리  (0) 2021.03.19
웹 아키텍쳐  (0) 2021.03.17
알고리즘의 time complexity...  (0) 2021.03.11
Prototype in Javascript  (0) 2021.02.26
자바 스크립트에서의 OOP  (0) 2021.02.26
:

바코드

웹 개발/Algorithm 2021. 3. 11. 16:28
더보기

문제

1, 2, 3으로만 이루어진 수열 바코드를 만들어야 합니다. 무조건 1, 2, 3만 붙여서 바코드를 만들었다면 쉬웠겠지만, 아쉽게도 바코드를 만드는 데에 조건이 걸려 있습니다. 바코드에서 인접한 두 개의 부분 수열이 동일하다면 제작할 수 없다고 할 때, 주어진 길이 len의 바코드 중 가장 작은 수를 반환하는 함수를 작성하세요.

만들 수 없는 바코드만들 수 있는 바코드
112 1312
1231312 3
232312 231213
  • 부분수열? 주어진 수열에서 연속된 모든 구간을 말합니다. 수열 123의 부분수열은 1, 2, 3, 12, 23, 123 입니다.
  • 인접한 두 부분수열? 첫번째 부분수열과 두번째 부분수열이 연속된 경우를 말합니다.
  • 수열 1234에서 인접한 부분수열 (우리는 두 부분수열이 같은 지 관심이 있으므로 길이가 서로 다른 경우는 무시한다)

    • 1과 2, 2와 3, 3과 4, 12와 34입니다.
  • 만들 수 없는 바코드를 보자면,

    • '11'2
    • 12'3131'2
    • '2323'12 인접한 두 개의 부분 수열이 동일하기 때문에 만들 수 없습니다. 고로, '12131213'과 같이 네 자리씩 중복되어도 만들 수 없습니다. 자릿수와 상관없이, 인접한(붙어있는) 부분수열이 같다면 바코드를 만들 수 없습니다.

입력

인자 1: len

  • Number 타입의 1 이상 50 이하의 자연수

출력

  • String 타입을 리턴해야 합니다.
  • 예시로, 121도, 123도 전부 바코드로 제작할 수 있지만 제일 작은 수는 121이기 때문에 121을 반환해야 합니다.

입출력 예시

let output = barcode(3);
console.log(output); // "121"

output = barcode(7);
console.log(output); // "1213121"

output = barcode(20);
console.log(output); // "12131231321231213123"
function barcode(len) {
  // TODO: 여기에 코드를 작성하세요.
  //len만큼 문자열에 숫자를 추가한다.
  //len이 2이면 '1'+'1' 해보고 check돌려서 true가 나오면 '1'+'2'를 해본다
  //len이 3이면 '11' '12' '121'
  //len이 4이면 '11' '12' '121' '1211' '1212' '1213
  let visited = {}
  let result= ''  
  result = makeCode(result, len, visited)
  console.log(visited)
  return result
  
}
function makeCode(code, len,visited,i =1){
  if(code.length < len){
    if(i > 3){
      let lastNum = code.slice(-1)            
      code = makeCode(code.slice(0,-1), len,visited, Number(lastNum) + 1)
    }
    for(; i<= 3 ; i++){
      code += String(i)      
      if(check(code, visited)){//만들수 없는 바코드
        code = code.slice(0,-1)//마지막꺼를 다시 뺌
        if(i === 3){ //3까지 시도를 해봤지만 전부 안됐음
          let lastNum = code.slice(-1)            
          code = makeCode(code.slice(0,-1), len, visited, Number(lastNum) + 1)
        }   
      }      
      else{//만들수 있는 바코드
        break;
      }      
    }
    return makeCode(code, len,visited, 1)
  }
  return code
}
function check(str, visited){
  //let str = String(num)
  if(visited[str] === undefined){
    let reversed = str.split('').reverse().join('');
    let halfLength = Math.floor(reversed.length /2) 
    for(let i= 1; i <= halfLength; i ++){
      if(reversed.slice(0,i)=== reversed.slice(i, i+i)){
        visited[str] = true
        return true//같은게 있다
      }
    }    
    visited[str] = false
    return false
  }
  else{//방문 했던 곳
    return visited[str]
  }
}

주의할것: migoreng.tistory.com/110

'웹 개발 > Algorithm' 카테고리의 다른 글

금고를 털어라  (0) 2021.03.11
짐 나르기  (0) 2021.03.11
연결된 정점들  (0) 2021.03.11
인접 행렬 길찾기  (0) 2021.03.11
인접 행렬 생성하기  (0) 2021.03.11
:

연결된 정점들

웹 개발/Algorithm 2021. 3. 11. 16:27
더보기

문제

방향이 있는 간선들의 목록이 주어질 때, 연결된 정점의 컴포넌트(그룹들)가 몇 개인지 반환하는 함수를 작성하세요.

입력

인자 1: edges

  • 2차원 Array 타입을 요소로 갖는 시작과 도착 정점이 담겨있는 배열들을 담고 있는 목록 (2차원 배열)
  • ex) [[0, 1], [1, 2], [3, 4]]

출력

  • Number 타입을 리턴해야 합니다.
  • 연결된 정점의 컴포넌트의 수를 숫자로 반환합니다.

주의사항

  • 주어진 간선은 무향입니다
    • [1, 2] 는 정점 1에서 정점 2로도 갈 수 있으며, 정점 2에서 정점 1로도 갈 수 있습니다.

입출력 예시

const result = connectedVertices([
	[0, 1],
	[2, 3],
	[4, 5],
]);
console.log(result); // 3

해당 정점들은 아래와 같은 모양을 하고 있습니다.

정점들
const result = connectedVertices([
	[0, 1],
	[2, 3],
	[3, 4],
	[3, 5],
]);
console.log(result); // 2

해당 정점들은 아래와 같은 모양을 하고 있습니다.

정점들
function connectedVertices(edges) {
  let result = []
  for(let edge of edges){
    //result: [[0,1],[2,3]]
    //edge : 3,4
    let li = edge
    let flag = false;
    //toDo
    for(let el of result){
      //el: [2,3]
      if(el.includes(edge[0]) || el.includes(edge[1])){
        flag = true
        if(el.includes(edge[0])){
          el.push(edge[1])
        }
        else{
          el.push(edge[0])
        }
      }
      
    }
    if(flag === false){
      result.push(li)
    }
  }

  let combine = function(arr){
    let result = []    
    for(let i =0; i<arr.length; i++){
      let nextArr = arr[i+1] || []
      let flag= false;
      
      for(let j=0;j<nextArr.length;j++){
        if(arr[i].includes(nextArr[j])){
          flag = true
        }
      }
        
      if(flag){//포함이 되있다.
        result.push(arr[i].concat(nextArr))//서로 포함관계인 두 요소를 합치고
        arr[i + 1] = arr[i+2] //합쳐졌으니 자리를 옮겨준다
        result = combine(result) //포함이 있는지 다시 확인. 있다면 다시 포함.없으면 그대로
      }else{
        result.push(arr[i])
        if(i === arr.length-1 && nextArr.length >= 1){
          result.push(nextArr)
        }
      }
    }
    return result
  }
  let result2 = combine(result)
  let tempArr = result2.slice()
  for(let el of tempArr){
    if(el === undefined){
      result2.pop()
    }
  }
  
  

  return result2.length
}

 

'웹 개발 > Algorithm' 카테고리의 다른 글

금고를 털어라  (0) 2021.03.11
짐 나르기  (0) 2021.03.11
바코드  (0) 2021.03.11
인접 행렬 길찾기  (0) 2021.03.11
인접 행렬 생성하기  (0) 2021.03.11
:

인접 행렬 길찾기

웹 개발/Algorithm 2021. 3. 11. 16:23
더보기

문제

주어진 인접행렬에서 한 정점으로부터 다른 정점으로 이어지는 길이 존재하는지 반환해야 합니다.

입력

인자 1: matrix

  • Array 타입을 요소로 갖는 인접 행렬이 담긴 2차원 배열

인자 2: from

  • Number 타입의 시작 정점

인자 3: to

  • Number 타입의 도착 정점

출력

  • boolean 타입을 리턴해야 합니다.
// function getDirections(matrix, from, to) {
//   // TODO: 여기에 코드를 작성합니다.
//   let passedIndex = []
//   let checkDirection = function(from){
//     let currentArr = matrix[from]
//     let isPassed = false;
//     let result = false;
//     if(currentArr[to] === 1){//직행이 있는지 확인
//       return true
//     }
    
//     for(let i = 0; i< currentArr.length; i++){
//       for(let el of passedIndex){//isPassed 만들기
//         if(el[0] === from && el[1] === i){
//           isPassed = true
//         }
//       }
//       if(currentArr[i] === 1 && isPassed === false){//다른 1인 요소가 있는지 확인      //갔었던 길인지 확인
//         passedIndex.push([from,i])
//         result = checkDirection(i)//그 요소로 들어가서 재귀      
//       }
//       if(result){
//         return result
//       }
//     }
//     return false
//   }
//   return checkDirection(from)

// }
function getDirections(matrix, from, to) {
  let passed = [from];
  let checkDirection = function (matrix, from, to) {
    if (matrix[from][to] === 1) {
      return true;
    }
    for (let i = 0; i < matrix[from].length; i++) {
      if (matrix[from][i] === 1 && !passed.includes(i)) {
        passed.push(i);
        if (checkDirection(matrix, i, to)) {
          return true;
        }
      }
    }
    return false;
  };
  return checkDirection(matrix, from, to);
}
//1. 요소의 값이 1인지 확인
// 1.true from,to 를 갔었던 길인지 확인
//  1.true.true 1.true 단계로 돌아가기
//  1.true.false 
// 
// 0 -> 3
// 0 1 0 1
// 0 0 0 1
// 0 1 0 0
// 1 0 0 0 
더보기

입출력 예시

const result = getDirections(
	[
		[0, 1, 0, 0],
		[0, 0, 1, 0],
		[0, 0, 0, 1],
		[0, 1, 0, 0],
	],
	0,
	2
);
console.log(result); // true
  • 정점 0에서 2로 가는 길이 존재하는지 확인합니다.
  • 0 --> 1 로 가는 간선이 존재하고, 1 --> 2 로 가는 간선이 존재하기 때문에 true를 반환합니다.

'웹 개발 > Algorithm' 카테고리의 다른 글

금고를 털어라  (0) 2021.03.11
짐 나르기  (0) 2021.03.11
바코드  (0) 2021.03.11
연결된 정점들  (0) 2021.03.11
인접 행렬 생성하기  (0) 2021.03.11
:

인접 행렬 생성하기

웹 개발/Algorithm 2021. 3. 11. 16:19
더보기

문제

방향이 있는 간선과 방향이 없는 간선들의 목록들을 받아 2차원 배열의 인접행렬을 반환하는 함수를 작성하세요.

조건

각 간선은 3가지 정보를 담고 있습니다.

  • 0번째: 간선의 시작 정점 (0 이상의 정수)
  • 1번째: 간선의 도착 정점 (0 이상의 정수)
  • 2번째: 방향성 ('undirected' 일시 무향, 'directed' 일시 방향)

입력

인자 1: edges

  • Number 타입의 방향/무향인 간선들의 목록이 담긴 배열

출력

  • Array 타입을 리턴해야 합니다.
  • 2차원 배열의 인접 행렬

주의사항

  • 정점 0에서 정점4로 이어주는 간선이 존재할 경우 정점 1, 2, 3도 존재합니다.
  • 반환하는 인접행렬은 2차원 배열이며, 행(row)는 바깥 배열, 열(column)은 안쪽 배열입니다.
    • let matrix = [[0, 0], [0, 0]]
    • matrix[0] === 0번째 행
    • matrix[0][0] === 0번째 행의 0번째 열
  • 두 정점간의 간선의 유무는 0과 1로 표시합니다.
    • 0: 두 정점간에 간선이 존재하지 않을 경우
    • 1: 두 정점간에 간선이 존재할 경우
  • 아래의 2차원 배열에서 세로축은 시작 정점, 가로축은 도착 정점입니다.

const matrix = [ [0, 0, 0], [0, 0, 0], [0, 0, 0], ];

function createMatrix(edges) {
	// TODO: 여기에 코드를 작성합니다.
  let maxNum = 0
  let numArr= []
  for(let a of edges){//배열의 크기 정하기(가장 큰 숫자 찾기)
    for(let b of a){
      if(typeof b === 'number'){
        numArr.push(b)
      }      
    }
  }
  maxNum = Math.max(...numArr)
  let matrix = []
  for(let i =0; i <= maxNum;i++){//배열 만들기
    matrix.push(new Array(maxNum + 1).fill(0))
  }
  //좌표 찾아서 값 바꾸기
  for(let edge of edges){
    matrix[edge[0]][edge[1]] = 1
    if(edge[2] === 'undirected'){
      matrix[edge[1]][edge[0]] = 1
    }
  }
  return matrix
}
//입출력 예시
let output1 = createMatrix([
	[0, 3, "directed"],
	[0, 2, "directed"],
	[1, 3, "directed"],
	[2, 1, "directed"],
]);

console.log(output1);
/**
 * [
 *  [0, 0, 1, 1],
 *  [0, 0, 0, 1],
 *  [0, 1, 0, 0],
 *  [0, 0, 0, 0]
 * ]
 */

let output2 = createMatrix([
	[0, 2, "directed"],
	[2, 4, "undirected"],
	[1, 3, "undirected"],
	[2, 1, "directed"],
]);

console.log(output2);
/**
 * [
 *  [0, 0, 1, 0, 0],
 *  [0, 0, 0, 1, 0],
 *  [0, 1, 0, 0, 1],
 *  [0, 1, 0, 0, 0],
 *  [0, 0, 1, 0, 0],
 * ]
 */

'웹 개발 > Algorithm' 카테고리의 다른 글

금고를 털어라  (0) 2021.03.11
짐 나르기  (0) 2021.03.11
바코드  (0) 2021.03.11
연결된 정점들  (0) 2021.03.11
인접 행렬 길찾기  (0) 2021.03.11
:

알고리즘의 time complexity...

웹 개발/Study 2021. 3. 11. 16:14

for문안에 재귀를 돌리게되면 time complexity는 매우 높아지게 된다.

따라서 최대한 for문이 적게 돌게끔 설계를 해줘야 큰 입력이 들어와도 감당이 된다.

더보기

문제

말썽꾸러기 김코딩은 오늘도 장난을 치다가 조별 발표 순서가 담긴 통을 쏟고 말았습니다.

선생님께서는 미리 모든 발표 순서의 경우의 수를 저장해 놓았지만 김코딩의 버릇을 고치기 위해 문제를 내겠다고 말씀하셨습니다.

김코딩은 모든 조별 발표 순서에 대한 경우의 수를 차례대로 구한 뒤, 선생님께서 숫자를 말하면 그 순서에 맞는 경우의 수를 말해야 하고, 발표 순서를 말하면 이 발표순서가 몇번째 경우의 수인지를 대답해야 합니다.

총 학생의 수 N과 선생님이 말하는 k가 주어질 때, 김코딩이 정답을 말 할 수 있게 올바른 리턴 값을 구하세요.

모든 경우의 수가 담긴 배열은 번호가 작을수록 앞에 위치한다고 가정합니다. ex) N = 3일경우, [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

입력

인자 1: n

  • Number 타입의 1 <= N <= 20인 조의 갯수

인자 2: k

  • k가 Number 일 때, k번째 배열을 리턴합니다.

ex) n이 3이고 k가 3일 경우

모든 경우의 수를 2차원 배열에 담는다면 [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]이 되고,

반환하는 값은 [2, 3, 1]이 됩니다.

  • k가 Array일 때, 몇 번째인지를 리턴합니다. (0 <= index 입니다.)

ex) n이 3이고 k가 [2, 3, 1]일 경우

모든 경우의 수를 2차원 배열에 담는다면 [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]이 되고,

반환하는 값은 3이 됩니다.

function orderOfPresentation(n, k) {
  // TODO: 여기에 코드를 작성합니다.
  let numbers = []
  for(let i = 1; i<=n ; i++){
    numbers.push(i)
  }
  //obj에다가 key를 경우의 수로 두고 value를 boolean으로 줘서 이미 사용했던 숫자인지 판별
  //만들었던 숫자이면 for문 안에서 numbers의 인덱스를 올려서 숫자 조합하기.
  //n이 몇이 될지 모르니까 재귀를 통해서 구현해야한다.
  //조합한 숫자는 result에 담고 obj에 키로 추가
   //사용했던 카드의 정보를 담아야한다
  
  let result = []
  // let rec = (obj = {} ,combinated = '') =>{
  //   for(let i = 0; i < numbers.length; i++){//카드들을 순회   
  //     //카드를 선택하기전에 사용가능한 카드인지 확인         
  //     if(obj[numbers[i]] === true || obj[numbers[i]] === undefined){//사용 가능한 카드
  //       combinated += numbers[i]//카드를 선택하고
  //       obj[numbers[i]] = false //사용했던 카드로 표시
  //       console.log('combinated: ', combinated)
  //       console.log('obj[numbers[i]]: ', obj[numbers[i]])

  //       //그다음 카드를 선택하기 위해 재귀
  //       if(combinated.length < n){
  //         console.log("재귀-----------")
  //         combinated = rec(obj,combinated)
          
  //       }
  //       else{//카드가 다 만들어지면 체크 
  //       let strArr = combinated.split('')
  //       let numArr = strArr.map((el)=>Number(el))
  //       //result에 넣기전에 숫자로 변환시키기
  //       result.push(numArr)              
  //       console.log('result: ', result)
  //       }
  //       combinated = combinated.slice(0,-1) //다음 숫자 확인을 위해 썼던거 뺴주기
  //       obj[numbers[i]] = true //재귀가 끝났으니 다시 사용 가능하게 해줌
  //     }
  //     console.log("obj: ", obj)
  //     console.log('end of for loop @@@@@@@@@@@@@@@@@@@@')
            
  //   }    
  //   return combinated
  // }
  // rec()
  //위의 코드는 나의 코드인데 아래 코드처럼 순회해야하는 배열 자체를 줄여주면 더 효율적으로 순회할 수 있다
  const permutation = (arr, m = []) => {
    // 탈출 조건을 생성합니다.
    // arr의 length가 0일 때 result에 만들어진 발표 순서 배열을 담습니다.
    if (arr.length === 0) {
      result.push(m);
    } else {

      // 순열의 재료가 담긴 배열을 순환합니다.
      for (let i = 0; i < arr.length; i++) {
        // 현재 배열을 카피합니다. (원본을 건드리면 모든 경우의 수를 찾을 수 없습니다.)
        let currentArray = arr.slice();
        // 제일 앞에 있는 요소를 가지고 와서 변수에 할당합니다.
        let element = currentArray.splice(i, 1);
        // 제일 앞에 있는 요소가 사라진 배열 ([1, 2, 3]이었다면 현재는 [2, 3])을 arr 인자에 넣고, m 배열과 element를 합쳐서 m 인자에 넣습니다.
        permutation(currentArray.slice(), m.concat(element));

        // 이렇게 되면 다음은 [2, 3]을 카피하고, element가 [2]가 될 것이며
        // 제일 앞에 있는 요소가 사라진 배열 [3]이 arr에 들어갈 것이고, element는 m과 다시 합쳐져 [1, 2]를 만들 것입니다.
        // 이렇게 계속 재귀를 돌려서 m이 [1, 2, 3]이 되면, arr의 lenght는 0이 될 것이고, 재귀에서 빠져나옵니다.
        // arr === []일 때(m이 [1, 2, 3]) result에 push를 하여 함수를 종료하고, 그다음 arr === [3]일 때(m이 [1, 2]) for문의 길이가 1이었으므로 함수를 그대로 종료하고,
        // arr === [2, 3]일 때(m이 [1]) for문은 arr.length에 따라 2번 돌기 때문에 2를 지나 3이 될 것입니다.
        // [1] => [1, 3] => [1, 3, 2] => (1의 모든 경우의 수를 다 돌았으니 2로 진입) [2] => [2, 1] => [2, 1, 3] ...
      }
    }
  };

  permutation(numbers);
  console.log('final result: ', result)
  //리턴
  if(Array.isArray(k)){
    return result.findIndex((el)=>{
      return String(el) === String(k)
    })    
  }else{
    return result[k]
  }
}
orderOfPresentation(5,3) //5만들어오게 되도 경우의수가 120가지, 9가 들어오게되면 36만가지가된다.

 

:

Prototype in Javascript

웹 개발/Study 2021. 2. 26. 11:40

Javascript는 프로토타입 기반 언어라고도 불리우는데, 모든 객체들이 속성과 메서드를 상속받기 위해 프로토타입 객체를 기본적으로 갖고있다. 상속받은 메서드와 속성들은 프로토타입 객체에 담긴다. 객체 인스턴스와 프로토타입간의 연결이 구성되고 이 연결을 따라 프로토타입 체인을 타고 올라가며 속성과 메서드를 탐색한다.

상속받은 멤버들을 담은 주머니라고 생각하면 편할거같다.

: