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

  1. 2021.03.11 연결된 정점들
  2. 2021.03.11 인접 행렬 길찾기
  3. 2021.03.11 인접 행렬 생성하기
  4. 2021.03.11 알고리즘의 time complexity...
  5. 2021.02.26 Prototype in Javascript
  6. 2021.02.26 자바 스크립트에서의 OOP
  7. 2021.02.23 그래픽 드라이버 nouveau 에서 nvidia로 변경하기
  8. 2021.02.20 Full time 프리코스 회고록

연결된 정점들

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

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

:

자바 스크립트에서의 OOP

웹 개발/Study 2021. 2. 26. 09:53

자바스크립트는 본래 객체 지향형이 아닌 언어였지만, 객체 지향 패턴으로 작성할 수 있다.

객체 지향형에는 4가지 컨셉이 존재한다.

 

  • Encapsulation (캡슐화)

  • Inheritance (상속)

  • Abstraction (추상화)

  • Polymorphism (다형성)

Encapsulation (캡슐화)

캡슐화는 데이터와 기능을 하나의 객체(또는 단위)에 넣어서 묶는것이다.

은닉화(hiding)라는 특징도 포함이 되어있는데, get/set 함수를 만들어 내부 데이터나 내부 동작이 외부로 전달되지 않도록 하는것이다. 하지만 javascript의 언어 특성상 은닉화는 불가능하다. (c#에서는 public/private 키워드로 가능)

느슨한 결합(Loose Coupling)에 유리: 언제든 구현을 수정할 수 있다

 

Inheritance (상속)

상속은 부모클래스의 메서드나 데이터등을 자식클래스가 물려받는것이다.  정확한 표현으로는; 기본 클래스(base class)의 특징을 파생 클래스(derive class)가 상속받는다.

부모클래스에게 상속받은 자식클래스는 부모의 모든 데이터 속성과 메서드들을 사용할수 있으며, 자식클래스가 데이터 및 메서드를 추가 한다고 해서 부모클래스에게 영향이 가지 않는다.

 

Abstraction (추상화)

추상화는 메서드의 사용을 사용자에게 맞추어 보다 편리하게 사용할 수 있도록 도와준다. 메서드의 복잡한 내부를 신경 쓸 필요 없이 사용할 때에는 단순하게 사용 할 수 있도록 하는것이다.

추상화와 캡슐화의 차이:

캡슐화가 코드나 데이터의 은닉에 포커스가 맞춰져있다면, 추상화는 클래스를 사용하는 사람이 필요하지 않은 메소드 등을 노출시키지 않고, 기능 단순한 이름으로 정의하는 것에 포커스가 맞춰져 있다.

 

Polymorphism (다형성)

다형성은 특정 기능을 선언(설계)부분과 구현(동작)부분으로 분리한 후 구현부분을 다양한 방법으로 만들어 선택하여 사용할 수 있게 하는 기능이다.
일반 객체지향 언어에서는 데이터 타입이 있다. 그래서 변수를 선언할 때 데이터 타입을 명시해야 한다. 하지만 자바스크립트의 경우는 그냥 변수라는 것만 알 수 있게 var 변수명 과 같은 식으로 데이터 타입을 명시하지 않고 선언을 한다.

**일반 객체지향언어의 경우 데이터 타입을 맞추지 않으면 에러가 난다. 

하지만 자바스크립트의 데이터 타입을 명시하고 변수 사용을 하지 않기 때문에 변수값에 어떤 데이터를 넣어도 에러가 나지 않는다.

그리고 일반 객체지향에서 다형성을 구현하려면 매개변수와 리턴값을 상속받는 메서드에 맞추어 구현하여야 한다. 그렇지 않으면 에러가 난다.

하지만 자바스크립트에서는 인터페이스, 추상 클래스 그리고 엄격한 데이터 타입 체크 등의 다형성과 관련된 문법은 지원되지 않는다. 그렇다면 자바스크립트에서의 다형성은 어떻게 구현해야 할까? 그냥 다형성이 지원한다고 생각하고 규칙에 맞춰 구현하는 방법밖에 없다. 즉 구현부에서 메서드를 작성할 때 선언부가 있다는 가정 하에 맞춰 구현해줘야 한다. 


참조: https://debugdaldal.tistory.com/152 [달달한 디버깅]

 

 

:

그래픽 드라이버 nouveau 에서 nvidia로 변경하기

OS/삽질하기 2021. 2. 23. 00:24

'OS > 삽질하기' 카테고리의 다른 글

MongoDB 실행 오류  (0) 2024.05.19
javascript 2차원배열의 얕은 복사  (0) 2021.03.20
:

Full time 프리코스 회고록

코드스테이츠 2021. 2. 20. 20:00

벌써 눈 깜짝 할 새에 프리코스가 지나갔다. 짧다면 짧고 길다면 긴 한달동안 정말 많은 페어분들과 함께했고 몇몇분은 아쉽게도 이머시브에서 뵙지 못하게 된다는걸 알았지만, 남은 분들과 열심히 해서 꼭 좋은곳에 취직을 했으면 좋겠다. 원래 solo week동안 복습을 조금 할 계획이였는데 이런 저런 약속이 많다보니 잘 지켜지지 못했다. 이제 내일 모레 시작하게 되니까 다시 초심을 찾아 마음을 다잡고 집중해서 공부 해야겠다.

'코드스테이츠' 카테고리의 다른 글

First Project 회고  (0) 2021.05.10
2주차 회고록  (0) 2021.02.03
: