오늘의 목표

더보기

✔️ 스탠다드 반 강의 OT

✔️ 프로그래머스 알고리즘 문제 풀이

✔️ 자바스크립트 강의 정리

❌ 개인 과제 진행


⏱️ 오늘의 일정

9:00 ~ 10:00 - 프로그래머스 알고리즘 문제 풀이
10:00 ~ 11:00 - 스탠다드 반 강의 OT

13:00 ~ 20:00 - 자바스크립트 강의 정리


📜 프로그래머스 알고리즘 문제 풀이

9:00 ~ 10:00 - 프로그래머스 알고리즘 문제 풀이

 

명예의 전당

https://github.com/YamSaeng/AlgorithmCodingTest/tree/main/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/1/138477.%E2%80%85%EB%AA%85%EC%98%88%EC%9D%98%E2%80%85%EC%A0%84%EB%8B%B9%E2%80%85%EF%BC%881%EF%BC%89

 

AlgorithmCodingTest/프로그래머스/1/138477. 명예의 전당 (1) at main · YamSaeng/AlgorithmCodingTest

This is an auto push repository for Baekjoon Online Judge created with [BaekjoonHub](https://github.com/BaekjoonHub/BaekjoonHub). - YamSaeng/AlgorithmCodingTest

github.com

 

📜 스탠다드 반 강의 OT

10:00 ~ 11:00 - 스탠다드 반 강의 OT

 

스탠다드 반 강의 OT 세션에 참여했다.

스탠다드 반은 CS 지식과 네트워크 지식을 강의하는 수업으로 매주 화, 목 10시에 시작한다고 공지를 받았다.

발제자 3명이 해당 주차의 주제를 각각 조사해오고 직접 발표를 한 뒤, 튜터님의 강의가 이어지는 방식으로 진행된다.

발제자 3명은 랜덤하게 돌려서 뽑는 방식이라고 하고, 발제자가 아니더라도 다른 사람들도 내용을 조사해 블로그에 게시한 후 링크를 전달해야 한다고 설명받았다.

 

📜 자바스크립트 강의 정리

13:00 ~ 20:00 - 자바스크립트 강의 정리

 

강의 시간에 배웠던 자바스크립트 강의와 수업 내용은 아니지만 필요한 내용도 함께 정리했다.

 

2024.08.22 - [Javascript/배열 ( Array )] - [Javascript] Array - 최대값, 최소값

 

[Javascript] Array - 최대값, 최소값

Array ( 배열 ) 에서 최대값과 최소값을 구하는 방법을 알아보자. Math.max(), Math.min() let maxValue = Math.max(1, 2, 3, 4, 5);let minValue = Math.min(1, 2, 3, 4, 5);console.log(maxValue); // 5console.log(minValue); // 1 Math.max()

program-yam.tistory.com

 

2024.08.22 - [Javascript/클래스( class )] - [Javascript] class

 

[Javascript] class

클래스는 객체를 생성하기 위한 템플릿으로 생각하면 된다.클래스를 생성하기 위해서는 class 키워드를 사용한다.기본 문법class MyClass { // 여러 메서드를 정의할 수 있음 constructor() { ... } method1() {

program-yam.tistory.com

 

2024.08.22 - [Javascript] - [Javascript] 프로토타입 ( Prototype )

 

[Javascript] 프로토타입 ( Prototype )

prototype 프로퍼티는 자바스크립트 내부에서 광범위하게 사용된다.모든 내장 생성자 함수에서 prototype 프로퍼티를 사용한다.Object.prototype빈 객체를 생성해보자.let obj = {};alert( obj ); // "[object Object]"

program-yam.tistory.com

 

2024.08.22 - [Javascript] - [Javascript] 화살표함수

 

[Javascript] 화살표함수

함수 표현식보다 단순하고 간결한 문법으로 함수를 만들 수 있는 방법이 있다. 바로 화살표 함수를 말하는데, 화살표 함수라는 이름은 문법의 생김새를 차용해 지어졌다.let func = (arg1, arg2, ...arg

program-yam.tistory.com

 

🌙 하루를 마치며

개인 과제도 진행을 해야하는데, 두통이 너무 심해 중간중간 약을 먹고 누워 있어서 진행을 하지 못했다.

한 2일간 계속 두통이 이어지는데 이유를 모르겠다..

 

앞서 언급했던 Node.js 강의 입문과 숙련이 모든 수강생한테 지급되었다. 

애초에 목표했던 대로 이번주 안에 과제를 제출하고 주말에 Node.js 강의를 수강하도록 해야겠다.

함수 표현식보다 단순하고 간결한 문법으로 함수를 만들 수 있는 방법이 있다.

 

바로 화살표 함수를 말하는데, 화살표 함수라는 이름은 문법의 생김새를 차용해 지어졌다.

let func = (arg1, arg2, ...argN) => expression

 

위처럼 코드를 작성하면 인자 arg1..argN을 받는 함수 func가 만들어지고,

함수 func는 화살표 우측의 표현식을 평가하고, 평가 결과를 반환한다.

 

let sum = (a, b) => a + b;

/* 
위 화살표 함수는 아래 함수의 축약 버전이다.
let sum = function(a, b) {
  return a + b;
};
*/

console.log( sum(1, 2) ); // 3

 

위처럼 ( a, b ) => a + b는 인수 a와 b를 받는 함수다.

( a, b ) => a + b 는 실행되는 순간 표현식 a + b를 평가하고 그 결과를 반환한다.

 

※ 인수가 하나밖에 없으면 인수를 감싸는 괄호를 생략할 수 있다

let double = n => n * 2;
// let double = function(n) { return n * 2 }과 동일하다.

console.log( double(3) ); // 6

 

 

※ 인수가 하나도 없을 경우 괄호를 비워놓으면 된다. 다만, 이 때 괄호는 생략할 수 없다.

let sayHi = () => console.log("안녕하세요!");

sayHi();

 

 

화살표 함수는 함수 표현식과 같은 방법으로 사용할 수 있다.

let age = prompt("나이를 알려주세요.", 18);

let welcome = (age < 18) ?
  () => console.log('안녕') :
  () => console.log("안녕하세요!");

welcome();

 

위처럼 함수를 동적으로 만들 수도 있다.

'Javascript' 카테고리의 다른 글

[Javascript] Node.js  (0) 2024.08.27
[Javascript] 자료형  (0) 2024.08.24
[Javascript] 프로토타입 ( Prototype )  (0) 2024.08.22
[Javascript] Random - 난수 생성하기  (0) 2024.08.21
[Javascript] Map  (0) 2024.08.19

prototype 프로퍼티는 자바스크립트 내부에서 광범위하게 사용된다.

모든 내장 생성자 함수에서 prototype 프로퍼티를 사용한다.


Object.prototype

빈 객체를 생성해보자.

let obj = {};
alert( obj ); // "[object Object]" ?

 

"[Object Object]" 문자열을 생성하는 코드는 어디에 있는걸까?

obj는 비어 있는데 말이다.

obj = new Object()를 줄이면 obj = {} 가 된다.

여기서 Object는 내장 객체 생성자 함수인데, 이 생성자 함수의 prototype은 toString을 비롯한 다양한 메서드가 구현되어 있는 거대한 객체를 참조한다.

Object의 prototype이 Object.prototype을 참조하는 그림

 

 

new Object()를 호출하면 새롭게 생성된 객체의 Prototype 은 Object.prototype을 참조한다.

new Object()를 사용해 생성된 객체의 Prototype이 Object.prototype을 참조하는 그림

 

 

따라서 obj.toString()을 호출하면 Object.prototype에서 해당 메서드를 가져오게 된다.

예시를 통해 확인해 보자.

let obj = {};

console.log(obj.__proto__ === Object.prototype); // true

console.log(obj.toString === obj.__proto__.toString); //true
console.log(obj.toString === Object.prototype.toString); //true

 

다양한 내장 객체의 프로토타입

Array, Date, Function을 비롯한 내장 객체들 역시 프로토타입에 메서드를 저장해 놓는다.

배열 [1, 2, 3]을 만들면 new Array() 의 디폴트 생성자가 내부에서 동작하여 Array.prototype이 배열 [1, 2, 3]의 프로토타입이 되고 개발자는 Array.prototype을 통해 배열 메서드를 사용할 수 있다.

 

명세서에선 모든 내장 프로토타입의 상속 트리 꼭대기엔 Object.prototype이 있어야 한다고 규정한다.

세 내장 객체를 이용해 지금까지 설명한 내용을 그려보면 다음과 같다.

 

 

이번엔 코드로 각 내장 객체의 프로토타입을 직접 확인해 보자.

let arr = [1, 2, 3];

// arr은 Array.prototype을 상속받았나요?
console.log( arr.__proto__ === Array.prototype ); // true

// arr은 Object.prototype을 상속받았나요?
console.log( arr.__proto__.__proto__ === Object.prototype ); // true

// 체인 맨 위엔 null이 있습니다.
console.log( arr.__proto__.__proto__.__proto__ ); // null

 

 

체인 상의 프로토타입엔 중복 메서드가 있을 수 있다.

Array.prototype엔 요소 사이에 쉼표를 넣어 요소 전체를 합친 문자열을 반환하는 자체 메서드 toString이 있다.

let arr = [1, 2, 3]
console.log(arr); // 1,2,3 <-- Array.prototype.toString의 결과

 

 

그런데 Object.prototype에도 메서드 toString이 있다. 이렇게 중복 메서드가 있을 때는 체인 상에서 가까운 곳에 있는 메서드가 사용된다. Array.prototype 이 체인 상에서 더 가깝기 때문에 예시에서는 Array.prototype의 toString이 사용된다.

 

 

Chrome 개발자 콘솔과 같은 도구를 사용해 console.dir를 사용하면 내장 객체의 상속 관계를 확인할 수 있다.

 

 

배열이 아닌 다른 내장 객체들 또한 같은 방법으로 동작한다. 

함수도 마찬가지며 call, apply를 비롯한 함수에서 사용할 수 있는 메서드는 Function.prototype에서 받아온다.

function f() {}

console.log(f.__proto__ == Function.prototype); // true
console.log(f.__proto__.__proto__ == Object.prototype); // true, 객체에서 상속받음

 

'Javascript' 카테고리의 다른 글

[Javascript] 자료형  (0) 2024.08.24
[Javascript] 화살표함수  (0) 2024.08.22
[Javascript] Random - 난수 생성하기  (0) 2024.08.21
[Javascript] Map  (0) 2024.08.19
[Javascript] 소수 올림, 내림, 반올림  (0) 2024.08.19

클래스는 객체를 생성하기 위한 템플릿으로 생각하면 된다.

클래스를 생성하기 위해서는 class 키워드를 사용한다.


기본 문법

class MyClass {
  // 여러 메서드를 정의할 수 있음
  constructor() { ... }
  method1() { ... }
  method2() { ... }
  method3() { ... }
  ...
}

 

위처럼 클래스를 만들고 new Myclass()를 호출하면 객체가 생성된다.

 

constructor()는 생성자로 new에 의해 자동으로 호출되고, 객체의 기본 상태를 설정해준다.

 

class User {
  constructor(name) {
    this.name = name;
  }

  sayHi() {
    console.log("안녕하세요");
  }
}

// 사용법:
let user = new User("Yam");
user.sayHi();

 

위처럼 new User("Yam")를 호출하면, 새로운 객체가 생성되고,

넘겨받은 매개변수와 함께 constructor가 자동으로 실행된다.

 

자바스크립트에서 클래스는 함수의 한 종류로 취급한다.

class User {
  constructor(name) { this.name = name; }
  sayHi() { console.log(this.name); }
}

// User가 함수라는 증거
console.log(typeof User); // function

 

class User 문법 구조가 하는일은 다음과 같다.

1. User라는 이름을 가진 함수를 만들고, 함수 본문은 constructor에서 가져온다.

    constructor가 없으면 본문이 비워진 채로 함수가 만들어진다.

2. sayHi와 같은 메서드를 User.prototype에 저장한다.

 

new User를 호출해 객체를 만들고, 객체의 메서드를 호출하면 메서드를 prototype 프로퍼티를 통해 가져온다.

이 과정이 있어서 객체에서 메서드에 접근할 수 있다.

 

class User {
  constructor(name) { this.name = name; }
  sayHi() { alert(this.name); }
}

// 클래스는 함수다.
console.log(typeof User); // function

// 정확히는 생성자 메서드와 동일하다.
console.log(User === User.prototype.constructor); // true

// 클래스 내부에서 정의한 메서드는 User.prototype에 저장된다.
console.log(User.prototype.sayHi); // console.log(this.name);

// 현재 프로토타입에는 메서드가 두 개다.
console.log(Object.getOwnPropertyNames(User.prototype)); // constructor, sayHi

 

 

class라는 키워드 없이도 클래스 역할을 하는 함수를 선언할 수 있다.

 

// class User와 동일한 기능을 하는 순수 함수를 만들어보자.

// 1. 생성자 함수를 만든다.
function User(name) {
  this.name = name;
}

// 모든 함수의 프로토타입은 'constructor' 프로퍼티를 기본으로 갖고 있기 때문에
// constructor 프로퍼티를 명시적으로 만들 필요가 없다.

// 2. prototype에 메서드를 추가한다.
User.prototype.sayHi = function() {
  console.log(this.name);
};

// 사용법:
let user = new User("John");
user.sayHi();

 

위 처럼 순수 함수로 클래스 역할을 하는 함수를 선언하는 방법과 class 키워드를 사용하는 방법의 결과는 거의 같다.

 

이 두 방법에는 중요한 차이가 몇가지 있다.

1. class로 만든 함수엔 특수 내부 프로퍼티인 IsClassConstructor : true 가 이름표처럼 붙는다.

    이것만으로도 두 방법엔 분명한 차이가 있음을 알 수 있다.

 

class User {
  constructor() {}
}

console.log(typeof User); // User의 타입은 함수이긴 하지만 그냥 호출할 수 없다
User(); // TypeError: Class constructor User cannot be invoked without 'new'

 

자바스크립트는 다양한 경우 IsClassConstructor : true를 활용한다.

클래스 생성자를 new와 함께 호출하지 않으면 에러가 발생하는데 이 때 IsClassConstructor : true 가 사용된다.

 

또 다른 차이점으로는

2. 클래스에 정의된 메서드는 열거할 수 없다.

    클래스의 prototype 프로퍼티에 추가된 메서드의 enumerable 플래그는 false 이기 때문.

    for in 으로 객체를 순회할 때, 메서드는 순회 대상에서 제외하고자 하는 경우가 많아 이 특징은 꽤 유용하다.

 

3. 클래스는 항상 엄격 모드로 실행된다. 클래스 생성자 안 코드 전체에 자동으로 엄격 모드가 적용된다.


클래스 표현식

함수처럼 클래스도 다른 표현식 내부에서 정의, 전달, 반환, 할당할 수 있다.

 

클래스 표현식을 만들어보자.

let User = class {
  sayHi() {
    console.log("안녕하세요.");
  }
};

 

 

기명 함수 표현식과 유사하게 클래스 표현식에도 이름을 붙일 수 있다.

클래스 표현식에 이름을 붙이면, 이 이름은 오직 클래스 내부에서만 사용할 수 있다.

// 기명 클래스 표현식(Named Class Expression)
// (명세서엔 없는 용어이지만, 기명 함수 표현식과 유사하게 동작한다.)
let User = class MyClass {
  sayHi() {
    console.log(MyClass); // MyClass라는 이름은 오직 클래스 안에서만 사용할 수 있다.
  }
};

new User().sayHi(); // 원하는대로 MyClass의 정의를 보여준다.

console.log(MyClass); // ReferenceError: MyClass is not defined, MyClass는 클래스 밖에서 사용할 수 없다.

getter와 setter

클래스는 getter와 setter를 지원한다.

get과 set을 이용해 user.name을 조작해보자!

class User {

  constructor(name) {
    // setter를 활성화합니다.
    this.name = name;
  }

  get name() {
    return this._name;
  }

  set name(value) {
    if (value.length < 4) {
      console.log("이름이 너무 짧습니다.");
      return;
    }
    this._name = value;
  }

}

let user = new User("성원");
console.log(user.name); // 성원

user = new User(""); // 이름이 너무 짧습니다.

 

참고로 getter와 setter는 User.prototype에 정의된다.


클래스 필드

클래스 필드라는 문법을 사용하면 어떤 종류의 프로퍼티도 클래스에 추가할 수 있다.

클래스 User에 name 프로퍼티를 추가해보자.

class User {
  name = "성원";

  sayHi() {
    console.log(`${this.name}님 안녕하세요!`);
  }
}

new User().sayHi(); // 성원님 안녕하세요!

 

 

클래스를 정의할 때 <프로퍼티 이름> = <값> 을 써주면 간단히 클래스 필드를 만들 수 있다.

클래스 필드의 중요한 특징 중 하나는 User.prototype이 아닌 개별 객체에만 클래스 필드가 설정된다는 점이다.

class User {
  name = "성원";
}

let user = new User();
console.log(user.name); // 성원
console.log(User.prototype.name); // undefined

 

 

 

 

참고 : https://ko.javascript.info/class

 

클래스와 기본 문법

 

ko.javascript.info

 

Array ( 배열 ) 에서 최대값과 최소값을 구하는 방법을 알아보자.

 

Math.max(), Math.min() 

let maxValue = Math.max(1, 2, 3, 4, 5);
let minValue = Math.min(1, 2, 3, 4, 5);

console.log(maxValue); // 5
console.log(minValue); // 1

 

Math.max() 함수는 입력받은 수 중 최대값을 구해서 반환해주는 함수다.

Math.min() 함수는 입력받은 수 중 최소값을 구해서 반환해주는 함수다.

 

위 함수들을 사용해 배열의 최대값과 최소값을 구하기 위해서는 

배열의 내용들을 꺼내 함수로 전달해주는 작업이 필요하다.

 

Spread Operator( 전개 연산자 )를 이용하면 배열의 내용들을 꺼내 함수로 전달할 수 있다.

let arr = [1, 2, 3, 4, 5];
let maxValue = Math.max(...arr);
let minValue = Math.min(...arr);

console.log(maxValue); // 5
console.log(minValue); // 1

 

 

 

오늘의 목표

더보기

✔️ 알고리즘 풀이 세션 듣기

✔️ 개인과제 발제 듣기


⏱️ 오늘의 일정

9:00 ~ 11:00 - 개인과제 발제, 알고리즘 풀이 세션

12:00 ~ 21:00 - 개인 과제 풀이


 

📜 개인과제 발제, 알고리즘 풀이 세션

9:00 ~ 11:00 - 개인과제 발제, 알고리즘 풀이 세션

 

어제 예고한대로 개인과제에 관한 설명과 알고리즘 풀이 세션이 있었다.

 

텍스트 게임

 

개인과제는 텍스트로 만드는 로그라이크 게임이였는데, 시작 화면은 위와 같다.

뼈대 코드는 제공되어서 그나마 편하게 구현할 수 있을 것 같다.

기간은 일주일로 충분히 주어진듯 하고, 필수 구현 목록과 도전 목록으로 구분되어 평가를 받는걸로 설명 받았다.

도전 목록까지 구현하고 제출하면 Node.js 강의를 지급받는다고 하는데, 이번주 안에 제출하는걸로 목표를 삼고

미리 Node.js 강의를 수강할 수 있도록 해야겠다.

 

알고리즘 풀이세션은 총 10문제가 주어졌는데, 아쉽게도 풀이는 총 4문제에 그쳤다.

10문제 모두 비교해보고 싶었는데 아쉽게 됐다. ㅠㅠ

 

원래는 여기에 코드를 다 올리려고 했으나, 난잡해 보일거 같아서 따로 글로 정리할 생각이다.


📜 개인 과제 풀이

9:00 ~ 11:00 - 개인 과제 풀이

 

기본 적인 뼈대가 제공되어서, 오늘은 플레이어의 공격과 몬스터의 공격까지 구현했다.

플레이어와 몬스터의 공통점이 많아서 Creature ( 생명체 ) 클래스를 만들어 부모로 삼았다.

class Creature {
    constructor() {
        this.name = null;
        this.weapon = null;
        this.inventory = [];
    }

    equipWeapon(weaponType) {
        switch (weaponType) {
            case '1':
                this.weapon = new MaceWeapon(this);
                break;
            case '2':
                this.weapon = new SwordWeapon(this);
                break;
            case '3':
                this.weapon = new TwohandSwordWeapon(this);
                break;
        }
    }

    attack(target) {
        if (this.weapon != null) {
            this.weapon.WeaponAttack(target);
        }
    }   

    OnDamage(damagePoint) {
        if (this.hp - damagePoint < 0) {
            this.hp = 0;
        }
        else {
            this.hp -= damagePoint;
        }
    }
}

 

 

플레이어의 공격과 몬스터 공격은 무기를 선택해 공격하는 방식으로 우선 구현했다.

플레이어는 게임 입장 전에 무기를 3가지 ( 둔기, 검, 대검 ) 중에 선택해 장착하고 공격을 하도록 했고,

몬스터는 공격을 할때마다 랜덤하게 3가지 무기 중 골라서 공격하는 방식으로 구현했다.

 

class Monster extends Creature {
    constructor() {
        super();
        
        this.name = "자바스크립트";
        this.hp = 1000;
        this.defensePoint = 0;
        this.criticalPoint = 0.6;
        this.inventory.push(new MaceWeapon(this));
        this.inventory.push(new SwordWeapon(this));
        this.inventory.push(new TwohandSwordWeapon(this));     
    } 

    attack(target) {
        let weaponChoiceNum = rand(0, 2);

        if (this.inventory.length > 0) {
            if (this.inventory[weaponChoiceNum] != null) {
                this.weapon = this.inventory[weaponChoiceNum];                

                this.weapon.WeaponAttack(target);
            }            
        }
    }
}

 

 

내일은 스테이지 클리어 조건과 랜덤하게 스테이지를 클리어 할때마다 추가 능력치를 부여할 생각이다.

 

🌙 하루를 마치며

오늘 드디어 개인과제가 시작되었다.

텍스트로 구현하는 게임은 경험이 좀 있어서 그런지 어떻게 구현할 지 생각이 바로바로 들었다.

자바스크립트로는 처음이기에 중간중간 막히는 부분은 튜터님이나 구글에 도움을 받아서

앞서 언급한대로 이번주 안에는 완성하는 것을 목표로 삼아야겠다.

Math.random()

 위 함수는 0 ~ 1 구간에서 부동소수점의 난수를 생성한다.

let rand1 = Math.random();
let rand2 = Math.random();

console.log(rand1);
console.log(rand2);

 

 

범위를 지정한 난수 생성

 정수인 난수를 생성하기 위해서는 Math.random() 함수와 Math.floor() 함수를 사용해 생성한다.

 Math.floor() 함수는 소수점 1번째 자리를 버려서 정수를 반환해주는 함수다.

let rand = Math.floor(Math.random());
console.log(rand); // 0

let rand2 = Math.floor(Math.random() * 10);
console.log(rand2); // 0 ~ 9

let rand3 = Math.floor(Math.random() * 11);
console.log(rand3); // 0 ~ 10

let rand4 = Math.floor(Math.random() * 100);
console.log(rand4); // 0 ~ 99

let rand5 = Math.floor(Math.random() * 10 ) + 1;
console.log(rand5); // 1 ~ 10

 

min 이상 max 이하 범위 안에서 랜덤하게 수 반환

function rand(min, max){
	return Math.floor(Math.random() * (max - min)) + min;
}

 

  

'Javascript' 카테고리의 다른 글

[Javascript] 화살표함수  (0) 2024.08.22
[Javascript] 프로토타입 ( Prototype )  (0) 2024.08.22
[Javascript] Map  (0) 2024.08.19
[Javascript] 소수 올림, 내림, 반올림  (0) 2024.08.19
[Javascript] this  (0) 2024.08.14

오늘의 목표

더보기

✔️ 알고리즘 세션 듣기

✔️ 알고리즘 도전 1일, 2일차 문제 풀기


⏱️ 오늘의 일정

9:00 ~ 10:00 - 알고리즘 세션 듣기
10:00 ~ 13:00 - 병원

13:00 ~ 16:00 - 알고리즘 도전 1일, 2일차 문제 풀기

16:00 ~ 17:00 - 자바스크립트 세션

17:00 ~ 21:00 - 알고리즘 도전 1일, 2일차 문제 풀기


📜 알고리즘 세션 듣기

9:00 ~ 10:00 - 알고리즘 세션 듣기

 

어제에 이어 오늘도 알고리즘 세션이 준비되어서 강의를 들었다.

알고리즘 문제가 제시되면 접근하는 방법과 연습문제를 제시하고 같이 풀어보는 방식으로 진행했다.

 

📜 병원

10:00 ~ 13:00 병원

 

엄마의 건강 이슈로 인해 병원에 다녀왔다.

정말 다행히도 우려했던 것과는 다르게 전달 받은 건강에 대한 정보가 너무 좋아서 한시름 놓게 되었다. 

계속 신경 쓰여서 걱정이 너무 되었는데, 온전히 공부에만 집중할 수 있을 것 같아 매우 다행이다.


📜 자바스크립트 세션

16:00 ~ 17:00 - 자바스크립트 세션

 

집에 도착해서 알고리즘 문제를 풀고 있을 때, 슬랙으로 16:00 부터 자바스크립트 세션이 있다고 전달받았다.

같이 수업받는 사람들이 공통적으로 어려워하는 부분을 파악하고, 해당 주제를 집중적으로 다루는 세션이였다.

 

this, 호이스팅, 동기, 비동기, promise 등에 관한 내용이였고, 도움이 되었다.


📜 알고리즘 도전 1일, 2일차 문제 풀기

13:00 ~ 16:00 - 알고리즘 도전 1일, 2일차 문제 풀기

17:00 ~ 21:00 -  알고리즘 도전 1일, 2일차 문제 풀기

 

어제에 이어서 알고리즘 2일차 문제 5가지가 제시되었다.

 

문제 1

주어진 문자열에서 중복된 문자를 제거하고, 남은 문자들을 원래 순서대로 반환하는 함수를 작성하세요.

제한사항:

  • 문자열의 길이는 1 이상 1000 이하입니다.

예시) const s = "abbccdeff"; // 출력 : "abcdef"

문제 2

 

주어진 배열에서 최솟값과 최댓값을 찾고, [최솟값, 최댓값] 형태의 배열을 반환하는 함수를 작성하세요.

제한사항:

  • 배열의 길이는 1 이상 1000 이하입니다.
  • 배열의 원소는 -1000 이상 1000 이하의 정수입니다.

예시) const arr = [1,2,3,4,5,6]; // 출력 [1,6]

 

문제 3

주어진 문자열을 요약하는 함수를 작성해주세요!

 

예시) str = 'aaabbbc' // 출력 : 'a3/b3/c1'

 

 

문제 4

주어진 배열에서 두 수를 선택하여 그 합이 주어진 target 값과 일치하는지 확인하는 함수를 작성하세요. 일치하는 경우 true, 그렇지 않은 경우 false를 반환하세요.

제한사항:

  • 배열의 길이는 2 이상 1000 이하입니다.
  • 배열의 원소는 1 이상 1000 이하의 자연수입니다.

예시) arr = [2,7,11,15], target = 9 // 출력 : true

 

문제 5

주어진 문자열이 유효한 괄호 조합인지 확인하는 함수를 작성하세요. 유효한 조합은 모든 여는 괄호가 올바르게 닫혀야 하며, 괄호의 순서도 일치해야 합니다.

제한사항:

  • 문자열의 길이는 1 이상 1000 이하입니다.
  • 괄호는 (), {}, []의 세 종류입니다.

예시) ({[]}] // 출력 : true

         ({][}) // 출력 : false

 


🌙 하루를 마치며

엄마 건강에 걱정이 많았는데 잘 해결된거 같아 정말 다행이다. 정말로.. ㅠㅠ

 

어제 오늘 제시된 알고리즘 10문제를 모두 풀기는 했다. 내일 9시에 있을 문제 풀이를 듣고,내가 풀이한 것과 튜터님의 풀이 방법을 비교해 글을 게시할 생각이다.

 

내일 또한 개인과제에 대한 설명이 있다고 전달 받았다. 기간은 일주일동안 과제를 풀어 제출해야한다고 하는데,자바스크립트를 처음 접해 걱정도 되고 기대도 된다.. 

 

오늘의 목표

더보기

✔️ 알고리즘 세션 듣기

✔️ 자바스크립트 수업 정리하기


⏱️ 오늘의 일정

9:00 ~ 10:30 - 알고리즘 세션
10:30 ~ 11:00 - 팀 배정

11:00 ~ 18:00 - 자바스크립트 수업 정리

18:00 ~ 21:00 - 알고리즘 과제 풀이


📜 알고리즘 세션

9:00 ~ 10:30 - 알고리즘 세션

 

미리 공지된 대로 알고리즘 세션이 9시 부터 있었고, 세션에 참가해 수업을 들었다.

기초적인 알고리즘에 관한 설명과 간단한 퀴즈를 내고 맞추는 세션이였다.

 

📜 팀 배정

10:30 ~ 11:00 - 팀 배정

 

저번주 금요일에 전체공지로 희망하는 팀을 구글폼으로 제출하라는 공지가 있었다.

자바스크립트 수강 여부에 따라 도전 팀과 집중팀으로 나눠 신청을 하라는 내용이였다.

자바스크립트 강의를 5주차까지 끝내긴해서 도전팀으로 신청하고, 도전 팀으로 배정받았다.

 

📜 자바스크립트 수업 정리

11:00 ~ 18:00 - 자바스크립트 수업 정리

 

다행히도 주말동안 5주차까지 강의를 모두 들어서,

자바스크립트 강의를 정리하고 있다. 

 

2024.08.19 - [Javascript] - [Javascript] 소수 올림, 내림, 반올림

 

[Javascript] 소수 올림, 내림, 반올림

올림 ( Math.ceil() )소수점 여부와 상관없이 올림 처리 한다.입력받은 수보다 크거나 같은 정수 중 가장 작은 정수를 반환한다. // 양수let ceil_1 = Math.ceil(1); // 1let ceil_2 = Math.ceil(1.22); // 2let ceil_3 = Mat

program-yam.tistory.com

 

2024.08.19 - [Javascript] - [Javascript] Array - push, pop, unshift, shift

 

[Javascript] Array - push, pop, unshift, shift

Array ( 배열 ) 기본 생성// 기본 생성let fruits = ["사과", "바나나", "오렌지"];// 배열 요소 접근console.log(fruits[0]); // "사과"  크기를 지정해 생성let number = new Array(5); push ( 데이터를 맨뒤에 넣기 )let f

program-yam.tistory.com

 

2024.08.19 - [Javascript] - [Javascript] Array - splice, slice

 

[Javascript] Array - splice, slice

splice 시작 위치부터 지정한 개수를 삭제하고, 시작 위치에 데이터를 넣는다.let fruits = ["배", "감", "귤", "두리안"]; // [1] 위치 : '감' 부터 2개( 감, 귤 )를 삭제하고 [1] 위치에 자두를 넣는다. fruits.s

program-yam.tistory.com

 

2024.08.19 - [Javascript] - [Javascript] Array - sort, reverse

 

[Javascript] Array - sort, reverse

sort ( 정렬 함수 )array.sort([compareFunction]) 매개변수 - compareFunction   - 정렬 순서를 정의하는 함수.     생략하면 배열은 각 요소의 문자열 반환에 따라 각 문자의 유니코드 포인트 값에 따라 정

program-yam.tistory.com

 

2024.08.19 - [Javascript] - [Javascript] Map

 

[Javascript] Map

Map은 키와 값으로 데이터를 저장하고 관리하는 객체다.key에는 어떤 데이터타입도 다 들어올 수 있다.Map은 키가 정렬된 순서로 저장된다. // 기본 형태let MyMap = new Map();// set(키,값) 데이터를 저장

program-yam.tistory.com

 

2024.08.19 - [분류 전체보기] - [Javascript] Set

 

[Javascript] Set

Set은 원시 값이나 객체 참조 값 등 모든 유형의 고유 값을 저장할 때 사용하는 객체다. 선언let mySet = new Set(); add ( 데이터 넣기 )Set에 데이터를 넣는다. 해당 값이 중복되면 데이터가 저장되지

program-yam.tistory.com

 

 

 

📜 알고리즘 과제 풀이

18:00 ~ 21:00 - 알고리즘 과제 풀이

 

알고리즘 세션을 듣고나서 1회차 문제가 제공되었다.

 

문제 1


두 자연수 a와 b가 주어질 때, 이 둘의 최대공약수를 구하는 함수를 작성하세요.

제한사항:

  • a, b는 1 이상 1000 이하의 자연수입니다.

 

문제 2


주어진 배열에서 짝수와 홀수의 개수를 각각 세는 함수를 작성하세요. 함수는 [짝수 개수, 홀수 개수]의 배열을 반환해야 합니다.

제한사항:

  • 배열의 길이는 1 이상 1000 이하입니다.
  • 배열의 원소는 1 이상 1000 이하의 자연수입니다.

 

문제 3


문자열이 주어지면 해당 문자열을 역순으로 배치한 후, 알파벳을 하나씩 오른쪽으로 이동시킨 결과를 출력하세요. 예를 들어, a는 b, z는 a로 변환됩니다.

제한사항:

  • 문자열은 소문자 알파벳으로만 구성됩니다.
  • 문자열의 길이는 1 이상 1000 이하입니다.

 

문제 4


회전 초밥을 먹을 때, 접시들의 번호가 주어집니다. 이 중에서 임의의 연속된 접시를 선택하여 먹을 때, 가능한 모든 선택에서 가장 다양한 초밥 종류의 개수를 구하세요.

제한사항:

  • 접시의 개수는 2 이상 1000 이하입니다.
  • 각 접시는 1 이상 30 이하의 정수로 표현됩니다.

 

문제 5


양의 정수가 주어질 때, 숫자에서 **k**개의 자릿수를 제거하여 얻을 수 있는 가장 큰 수를 구하세요.

제한사항:

  • **number**는 최대 1,000,000자리까지 입력될 수 있습니다.
  • **k**는 1 이상 len(number) - 1 이하입니다.

 

🌙 하루를 마치며

 

본격적인 알고리즘 문제 풀이의 시작!

오늘과 내일, 다음주 월, 화까지 알고리즘 세션이 잡혀있다.

그리고 이제부터 매일 10 : 00 ~ 11 : 00 가 알고리즘 문제 푸는 시간으로 정해졌다.

세션을 들어 알고리즘 문제 풀이에 도움을 받고, 따로 유튜브로 듣고 있는 강의도 꾸준히 들어야겠다.

 

선택 정렬

 

선택 정렬( Selection Sort )은 버블 정렬과 유사한 알고리즘으로, 해당 순서에 원소를 넣을 위치는 이미 정해져 있고, 어떤 원소를 넣을지 선택하는 알고리즘이다. 선택 정렬과 삽입 정렬를 헷갈릴 수 있는데, 선택 정렬은 배열에서 해당 자리를 선택하고 그 자리에 오는 값을 찾는 것이라고 생각하면 된다.

 

선택 정렬은 3가지의 과정을 반복하며 정렬을 수행한다.

 1. 선택한 곳의 데이터보다 더 작은 데이터가 있는지 순환하며 찾는다.

 2. 구한 가장 작은 최솟값을 맨 앞에 위치한 값과 교체한다.

 3. 맨 앞의 위치를 하나씩 앞으로 옮겨가며 반복한다.

 

#include<iostream>
using namespace std;

int main()
{
	int Array[] = { 10,9,8,7,6,5,4,2,3,1 };
	int MinIndex;
	int Number;

	for (int i = 0; i < 9; i++)
	{
        // 맨 앞 위치 선택
		MinIndex = i;

		for (int j = i + 1; j < 10; j++)
		{
            // 선택한 위치 값과 다른 위치 값들비교
            // 더 작은 값이 있으면 위치값 갱신
			if (Array[MinIndex] > Array[j])
			{				
				MinIndex = j;
			}
		}
        
        // 한번 반복하고 나면 스왑
		swap(Array[i], Array[MinIndex]);
	}

	return 0;
}

 

 

시간복잡도

데이터의 개수가 n개라고 할 경우,

  • 첫 번째 회전에서의 비교횟수 : 1 ~ ( n - 1 ) => n - 1
  • 두 번째 회전에서의 비교횟수 : 2 ~ ( n - 1 ) => n - 2
  • ...
  • (n-1) + (n-2) + ... + 2 + 1 => n(n-1) / 2

비교하는 것이 상수 시간에 이루어진다는 가정 아래에서 n개의 주어진 배열을 정렬하는데

O( n^2 ) 만큼의 시간이 걸린다. 최선, 평균, 최악의 경우 시간복잡도는 O( n^2 )로 동일하다.

 

공간복잡도

주어진 배열 안에서 교환(swap)을 통해, 정렬이 수행되므로 O(n) 이다.

+ Recent posts