-
항해 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
'항해 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