ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 항해 99 5기 TIL_32
    항해 99 2022. 2. 11. 02:02

    ▶ Today I Learned

    <알고리즘 스터디>

     

    [신고 결과 받기] (이틀 전 풀지 못한 문제)

     

    https://programmers.co.kr/learn/courses/30/lessons/92334

    소요시간: 1시간

    시간 내 해결 여부: 여전히 미해결

     

    let id_list = ["muzi", "frodo", "apeach", "neo"]
    let report = ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"]
    // ["ryan con", "ryan con", "ryan con", "ryan con"]
    
    let k = 2
    
    // 예상 결과 result 값 [2,1,1,0]
    
    // 문자열 알파벳 소문자, 중복 아이디 x 동일 유저 신고 여려번 해도 1회로 처리
    
    let i = 0
    let reporters = []
    let reported = []
    let noDoubleReports = []
    
    // 신고 중복검사
    for (let j = 0; j < report.length; j++) {
    
      if(noDoubleReports.includes(report[j])) {
        j++
      } else {
        noDoubleReports.push(report[j]);
      }
      
    }
    console.log(noDoubleReports);
    
    for(i; i < report.length ; i++) {
    
    reporters.push(noDoubleReports[i].split(' ')[0]);
    reported.push(noDoubleReports[i].split(' ')[1]);
    
    }
    
    console.log(reporters);
    console.log(reported);
    console.log(id_list);
    
    
    // console.log(id_list.find(x=> reported.includes(x)))
    
    // while(j < id_list) {
    
    // }
    
    let reportedListById = id_list.map((v, i) => reported.filter(x => x === v))
    
    console.log(reportedListById)
    
    let j = 0
    let nameToFind = []
    
    while(j<reportedListById.length) {
    
    if (k <= reportedListById[j].length) {
       nameToFind.push(reportedListById[j][0]) // 신고k번이상 당한사람 구하기 완료
     }
     j++
    }
    
    console.log('이것이 네임투파인드다', nameToFind)
    
    //이메일 보낸 횟수 구하여 배열에 담기
    let emailList = []
    
    console.log(report[0].substring(report[0].indexOf(' ')))
    console.log(nameToFind.includes(report[0].substring(report[0].indexOf(' ')))) // 뒤의 문자열 비교
    console.log(report[0].substring(0,report[0].indexOf(' ')))
    
    let arr2 = report.map((v, i) => 
    {if (nameToFind.includes(v.substring(report[i].indexOf(' ')))) {
    v = v.substring(0,report[i].indexOf(' '))
    }})
    
    console.log(arr2)
    
    // 신고당한 사람 횟수 체크 후
    // 신고자와 신고당한자의 연결

    조금만 더 고민하면 될 것 같다..! 마무리가자..!

     

    [CS]

     

    [이진수로 숫자와 문자 나타내기]

     

    두 가지 만으로 복잡한 세상을 나타낸다? 수학이 필요함 

    1, 0으로 숫자와 참과 거짓을 나타냄 -> 이를 비트에 적용

    처음 비트는 음양 구분

    1BYTE = 8bit

    과거 컴퓨터 8비트 지금은 32비트나 64비트

    64비트로 나타낼 수 있는 숫자 : 약 2경

    64비트 메모리 주소 -> 부동소수점도 나타냄 (왜 부동소수점인가? 소수점은 정수 사이에서 얼마든지 모습을 달리할 수 있기에! 0과 1사이에는 0.3333, 0.5342543534 등등)

    0.6259 유효숫자 + 10**3 에서 3 지수

    컴퓨터로 알파벳을 나타낼 때 숫자로 나타냄

    ASCII : . , @ 등 표기 가능

    (ASCII는 문자를 이진수로 정의하는 체계 잡음, 이미지, 동영상 등은 사실 모두 0과1의 연속으로 나타난다.)

    ASCII는 초기의 인코딩 표준

    그러나 언어간 인코딩이 되어있지 않아 문제 상호운용이 안됨

    ⇒ UNICODE : 각 나라의 모든 문자 포괄, 16비트 사용

    2진법 더하기

      1 1 1 1 1  (받아올림)
        1 0 1 1 1
     +    1 1 0 1
    -------------
      1 0 0 1 0 0
    

     

     

    출처:

    https://www.youtube.com/watch?v=1GSjbWt0c9M&list=PL8dPuuaLjXtNlUrzyH5r6jN9ulIgZBpdo&index=5 

     

    [getter와 setter]

     

    • getter와 setter는 무엇인가?

    이 둘은 모두 접근자 property이다.

    cf) 접근자 property란?

    객체의 프로퍼티는 데이터 프로퍼티(data property)와 접근자 프로퍼티(accessor property)로 나뉨

    접근자 프로퍼티의 본질은 함수이며 이 함수는 값을 획득(get)하고 설정(set)하는 역할을 담당함

    getter: 클래스 필드(멤버 변수, 클래스 내 생성자에 들어가는 변수들)의 값을 조작하는 행위에 사용하는 것,

    getter는 메소드 이름 앞에 get 키워드를 사용해 정의함 ex) 가격 값 불러오기 메소드 → get Price()무언가를 가져올 때 쓰므로 반환 값 필요

    setter: 클래스 필드의 값을 조작하는 행위에 사용하는 것,

    메소드 이름 앞에 set 키워드를 사용해 정의 ex) 가격 설정 메소드 → set Price()

    예시

    // 프로퍼티 name과 surname이 있는 객체 user 만들기
    
    let user = {
      name: "John",
      surname: "Smith",
    
      get fullName() {
        return `${this.name} ${this.surname}`;
        // getter, user.fullName을 실행할 때 실행되는 코드
      },
    
      set fullName(value) {
        [this.name, this.surname] = value.split(" ");
    // setter, user.fullName = value를 실행할 때 실행되는 코드
      }
    };
    
    // 주어진 값을 사용해 set fullName이 실행됩니다.
    // 만약 여기서 setter가 없다면 아래 구문에선 Error가 발생
    user.fullName = "Alice Cooper";
    
    alert(user.name); // Alice
    alert(user.surname); // Cooper
    

    cf) 클래스 필드란 무엇이며 어디에 선언하는가?

    클래스 필드는 멤버 변수를 말함

    class Foo {
      let name = 'Kim'; // SyntaxError
    // 클래스 몸체가 constructor() {} 부분을 제외한 이곳인데 이곳에는 메소드만 선언할 수 있다.
      constructor() {
    let name = 'Kim'	// 클래스 필드의 선언과 초기화는 반드시 constructor 내부에서 실시
    }
    }
    
    • getter와 setter는 왜 사용하는 건가?

    setter를 통해서만 값을 설정할 수 있기에 복잡한 코드에서 다른 메소드에 의해 값이 변경되는 것을 방지할 수 있기 때문이다.

    그렇담 getter는? 어차피 값 자체에 영향을 끼칠 수 없으니 값은 그냥 자유롭게 가져오면 안되는 걸까?

    getter를 쓰게 되면 엄청 긴 코드의 프로젝트에서 다른 사람의 코드 속 모든 변수 값을 가져올 필요가 없다.

    자동차 게임을 개발하는 상황을 가정해보자. 만약 당신이 자동차가 충돌 시 튕겨나가는 이벤트 처리를 만드는 일을 담당한다면, 충돌하는 자동차의 색상이나, 브랜드를 알아야할까? 아마 불필요한 정보에 신경이 빼앗길 것이다.

    출처:

    https://ko.javascript.info/property-accessors

    https://poiemaweb.com/es6-class

    https://ecsimsw.tistory.com/387

     

     

    [자바스크립트 주석 내부 @]

     

    우리의 지난 과제를 보다보면 다음과 같은 부분이 있다.

    /**
    * @type {Site} // 여기서 주석에 왜 굳이 '@'를 붙일까?
    */
    

    위에 내가 표시한 저 부분에 @는 왜 쓰는 걸까?

    자바스크립트는 type이 불명확하기 때문에 문서화를 통해 그 상세정보를 남겨야 한다. 그러나 소스코드와 해당 문서를 분리하게 되면 활용하기 번거로울 수 있다.

    그래서 소스코드 내 문서화가 되어야 하는데 이때 활용하는 것이 바로 주석이다.

    해당 주석의 내용은 연결된 함수나 요소들에 마우스를 롤오버 했을 때 표시된다.

    따라서 반환 값, 함수 기능을 알기 위해 소스코드를 보지 않아도 된다.

     

    출처:

    https://developingbear.tistory.com/157

    // 주석의 종류
    
    // 1. 그냥 대쉬 2개, 한 줄 주석
    
    /*
    2. 다중 주석, 범위 내 모든 내용이 주석처리됨
    */
    
    /**
    * 3. 다중 주석의 다른 형태
    * IDE에 따라 다중 주석 시 줄마다 *가 붙기도 함. 기능적으로는 차이가 없음
    */
    

    사용 예시

    /**
         * @type {boolean}
         */
        readOnly: boolean = false;
    
    /**
         * @type {Function|null}
         */
        repository: ?Function = null;
    

    출처:

    https://gist.github.com/SerafimArts/f802c544d8e9d15f5eece1dfb2664929

    p.s. 예시로는 type을 주석에 넣는 것만 들고 왔지만 실제론 더 많은 정보를 넣을 수 있다.

     

     

    [자바스크립트에서 접근제한자를 쓸 수 있을까?]

     

    - 접근 제한자가 무엇인가?

     

    말 그대로 클래스 별 접근 권한을 제한하여 속성과 메소드를 묶어주고

    필요 시 정보를 은닉하기도 해주는 캡슐화의 좋은 도구이다.

    데이터를 외부로부터 숨기거나 접근을 막는 등 접근에 대한 처리를 한다.

    Java에는 다음과 같은 접근 제한자가 있다.

     

    default : 같은 패키지 내에서만 접근 가능

    public : 제한 없음, 클래스 내부, 외부 모두 접근 가능

    private: 같은 상속 구조라도 접근이 불가능 하며 내부에서만 접근 가능

    protected: 클래스 내부 간 같은 상속 구조라면 접근 가능

    (이를 완전히 이해하기 위해서는 패키지, 클래스, 객체, 상속, 캡슐화에 대한 이해가 필요할 것이다.)

     

    패키지라는 말을 빼고 이야기하면 아래와 같을 것이다.

     

    public: 클래스 내부, 외부 모두 접근이 가능

    protected : 같은 패키지내 또는 자손 클래스일 경우 접근 가능

    private : 같은 클래스 내에서만 접근 가능

     

    - 자바스크립트에서도 접근 제한자를 쓸 수 있는가?

     

    https://poiemaweb.com/es6-class의 다음 말에 따르면 쓸 수 없다.

    “ES6의 클래스는 다른 객체지향 언어처럼 private, public, protected 키워드와 같은 접근 제한자(access modifier)를 지원하지 않는다.”

    그러나 “2019년 5월 현재 TC39 프로세스 의 stage 3(candidate)  단계에 있는 Class field declarations proposal 에는 Private field 에 관한 제안도 포함되어 있다.”

    해당 private field 링크에 따르면 다음과 같다.

     

    To make fields private, just give them a name starting with #

    class X {
      #foo;
      method() {
        console.log(this.#foo)
      }
    }
    

    그러나 이는 공식화 된것은 아닌 듯 하다.

     

    출처: https://github.com/tc39/proposal-class-fields#private-fields

    https://ecsimsw.tistory.com/387

     

     

    ▶ 느낀 점

     

    한 주의 과제를 모두 잘 마무리했고 오늘도 이렇게 한 주차가 끝났다. 많이 했다면 많이 했고 아니라면 아니지만 벌써 한 달이 넘었다.

    두 달 남짓 남은 이 시점, 여전히 부족함을 느끼는 스스로다.

    앞으로는 좀 더 바빠지고 피곤해지겠지만 2년간 회사를 다니며 기다려왔던 내 소망을 잊지 말자.

    하고 싶은 공부를 하고 있는 지금, 좀 더 푹 빠져보자. 나 자신 화이팅팅 :)

     

    ▶ 공부 시 참고 링크들

     

    substr()의 지원이 점점 종료되는 것 같으니 사용에 참고하자.

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr

     

    String.prototype.substr() - JavaScript | MDN

    The substr() method returns a portion of the string, starting at the specified index and extending for a given number of characters afterwards.

    developer.mozilla.org

     

     

     

     

     

     

     

    '항해 99' 카테고리의 다른 글

    항해 99 5기 TIL_34  (0) 2022.02.13
    항해 99 5기 TIL_33  (0) 2022.02.12
    항해 99 5기 TIL_31  (0) 2022.02.10
    항해 99 5기 TIL_30  (0) 2022.02.09
    항해 99 5기 TIL_29  (0) 2022.02.07
Designed by Tistory.