Today I learned :
- S.O.S 문서 참고하여 data structure 비교 및 배울 점 찾기
- While loop
- Double bang !!
- 다른 파일에서 변수 참고하는 방법
오늘의 생각 :
크리스마스🎄의 저주는 아직 끝나지 않았다.
작년엔 법인 아파트 명의 이전이 크리스마스 당일에 안 된다고 통보 아닌 통보를 받아,
한국에 가고자 했던 티켓을 취소하고 휴가를 반납해야 했다.
이번 년도에는 급작스러운 고객사의 요청에 의해
달랏에서 연휴를 보내겠다는 나의 야심찬 계획은 수포로 돌아갔다... 하....
3주 내내 스트레스가 거의 최대로 쌓이는 중인데, 운동을 갈 시간이 없다니,
내일은 공부를 안하더라도 기어코 운동을 가서 2시간 버닝하며 스트레스를 날리고 올것임!!!!!
Linkedlist를 Functional style 로 구현하기
S.O.S 문서를 보니, 내가 너무 어렵게 생각을 했나보다. 재귀를 사용하지 않고 이렇게 간단하게 구현할 수 있었다니.
Simple is the best. 간단 명료한 코드가 언제나 보기 좋은 것 같다.
아래는 내가 작성한 코드
list.addToTail = function(value) {
var newNode = Node(value);
if (!list.head) {
list.head = newNode;
list.tail = newNode;
} else {
let recurse = function(temp) {
//재귀를 이용해 노드 생성 -> 헤드에서 타고 타고 꼬리까지 도착
//굳이 이렇게 까지 할 필요 없었음
if (!temp.next) {
let temp1 = newNode;
temp.next = temp1;
list.tail = temp1;
} else recurse(temp.next);
};
recurse(list.head);
}
};
다음은 참조 코드
list.addToTail = function(value) {
const newTail = new Node(value);
if (!list.head) {
list.head = newTail;
}
// 그냥 이렇게 아래처럼 테일 다음에 넣어주기만 하면 되었음!
if (list.tail) {
list.tail.next = newTail;
}
list.tail = newTail;
};
나는 list.tail 이 주어진 사실을 망각하며, head 에서 타고타고 tail 에 도달하여,
tail에 도착하면, 새로운 노드를 이어주는 방식을 이용했는데, 그럴 필요가 전혀 없었다.
바로 tail에 접근하여 tail.next = newTail 하면 되는 것이였다.
또 다른 부분 . contain() 구현하는 부분이 나와는 달랐다. 나는 정말 재귀를 좋아하는 것 같아...
이번에도 난 재귀를 사용했고, 참고 코드는 while 반복 문을 사용했다.
해당 매소드의 핵심은, 모든 instance를 순회(traversal)하여야 한다는 것이다.
다음은, 재귀 러버의 코드. 거의 모든 data structure에 재귀를 사용한 것 같다.
list.contains = function(target) {
let recurse = function(temp) {
if (temp.value === target) {
return true;
} else {
return temp.next === null ? false : recurse(temp.next);
}
};
return recurse(list.head);
};
return list;
};
다음은 참조 코드.
list.contains = function(target) {
let node = list.head;
while (node) { //node 값이 있을 때까지,
if (node.value === target) {
return true;
}
node = node.next;
}
return false;
};
return list;
};
그러다 문득, for loop는 자주 사용하여 잘 알고 있지만, While는 잘 사용하지 않아 생소하다는 생각이 들었다.
While Statement
The while statement creates a loop that executes a specified statement as long as the test condition evaluates to true. The condition is evaluated before executing the statement.
while(condition) {Statment}
괄호 안의 조건이 참일 때 까지만 statement 를 실행하고, 거짓일 때 다음 코드로 넘어간다.
statement 안에는 break statment를 사용할 수 있다.
사용 예시))
var n = 0; //for loop 와 다르게 밖에서 정의해준다.
var x = 0;
while (n < 3) {
n++;
x += n;
}
Double bang !!
감탄표를 영어로 bang 이나 screamer 으로도 불린다는 것을 구글링으로 알게 되었다.
S.O.S 문서를 보다가 해당 기호를 발견 했고, 그 기호를 왜 사용하는지 궁금해서 구글링했다.
One of the benefits of using the !! is to convey that your design decision was to only return Boolean value only. (출처)
해당 연산자는 " ", undefined, 0, NaN에 대해서만 false 를 리턴하고, 나머지에 대해선 true 를 반환한다.
해당 예시를 살펴 보면,
GraphAM.prototype.contains = function(node) {
return !!this.nodes[node];
};
this.nodes[node] 가 0, undefined, " ", NaN값을 제외한, 어떠한 값이라도 담겨 있으면 truthy 한 값을 리턴한다.
Graph 를 Pseudoclassical style 로 구현하기
Pseudo 가 [soodo] 로 발음되는 건 여전히 낯설다. 찾아보니 그리스 어에서 유래한 단어였다.
The prefix pseudo- (from Greek ψευδής, pseudes, "lying, false") is used to mark something that superficially appears to be (or behaves like) one thing, but is something else. Subject to context, pseudo may connote coincidence, imitation, intentional deception, or a combination thereof. (출처 : 위키피디아)
나의 그래프 알고리즘은 출제자의 의도와 거리가 있는 로직인 것 같다.
(참고 코드를 보니 알게 되었다. 알고리즘이 다른 것을 보고 이렇게 할 수도 있구나 감탄하는게 나름의 재미^^)
노드를 추가한 대로 this.nodes에 담고, this.edges에 노드 스트링을 있는 그대로 담았다.
Graph = {
nodes : ['a', 'b', 'c', 'd'];
edges : ['a, b', 'b, a', 'c, d', 'd, c']
}
참고 코드를 살펴 보니, nested array 로 adjacency matrix 행렬을 만드는 것이였다.
Graph = {
nodes : a: [ b: true ],
b: [ a: true, c: true ],
c: [ b: true, d: true ],
d: [ c: true ]
}
&& operator
console.log(undefined && 1); //undefined
console.log(null && 1); //null
console.log(2 && 1); //1
console.log('a' && 1); //1
다른 파일에서 변수 참고
// 다른 file에서 작성된 정보(module)을 불러오는 방식입니다.
const { LimitedArray, getIndexBelowMaxForKey } = require("./hashTableHelpers");
마치 엑셀의 다른 sheet 에서 값을 불러올 때 쓰는 느낌이다.
HashTable 을 PseudoClassical style 로 구현하기
전체적인 로직은 비슷하나, 역시 출제자의 의도와 조금 거리가 있게 작성했다.
hashtable helpers 에 친절하게 정의 되어 있는 매소드를 전혀 활용을 못했다.
앞으로는 기존에 있는 코드를 주의깊게 살펴, 활용할 수 있도록 해야겠다.
'2. 우당탕탕 개발자 > 2-1. 공부기록' 카테고리의 다른 글
22Dec2019 TIL (0) | 2019.12.23 |
---|---|
20Dec2019 TIL (0) | 2019.12.21 |
17Dec2019 TIL (0) | 2019.12.18 |
16Dec2019 TIL (0) | 2019.12.17 |
15Dec2019 TIL (0) | 2019.12.15 |
댓글