JSON.stringify()
개요
JSON과 관련해서 쓰이는 유용한 JavaScript method로, JavaScript 객체나 값을 JSON 에서 해석 가능 하도록 변환해 주는 유용한 툴이다. 이번 과제에서는 JSON 의 구조를 이해하고 이와 같은 method 를 나만의 코드로 구현해 보는 시간을 갖았다.
What I learned
- JSON은 가벼운 데이터 교환 포멧으로 인간이 쉽게 쓰거나 읽을 수 있도록 만들어졌다. 기계가 이것을 parse 하거나 만들어내기도 쉽다.
- JSON 자료 형식은 독자적인 언어이나, C, C++, C#, Java, JavaScript 등 언어에서 주로 쓰이는 요소들을 가져다 쓴다.
- JSON은 다음과 같은 두 가지 구조로 이루어져있다.
- JSON 에 대한 해석의 분기는 크게 object / array 로 나뉘어져 있으며, string, number, whitespace 등의 개념이 있다.
- 객체나 배열은 일반적인 1차원 depth 에 대한 iteration 으로 알 수 없기에 (nested Array 등의 존재 유무), 어제의 getElementsByClassName 과 같이 recursion 을 통해 접근하여 각각의 요소들을 검사해야 했다.
- function 은 빈 객체 처리를 한다.
- 만약 depth 를 계속 iterate 하다가 더 이상 파고들 depth 가 없다면 undefined 가 나오기 때문에 이 것이 바로 기본적인 recursion 의 base case가 된다.
- object 의 key 와 value 를 String() method 등을 써서 stringify 시키려고 하면 {object Object} 라는 결과값이 나온다. console.log 를 이용해 테스트 할 수 있다. 따라서 iterate 되는 각 객체를 배열에 보관하고 이를 :, {}, 등을 join(, ) method 를 통해 연결하여 객체의 모습처럼 구현시키는 것이 필요했다.
- Refactor: Object.key(parameter obj).forEach 를 통해 for ... in 과 마찬가지로 객체를 iterate 할 수 있다.
- 만약 배열을 이용하지 않고 다른 방식으로 해당 method 를 구현할 수 있을까? 생각하게 되었는데, 기존의 객체를 iterate 하여 각각의 내용을 마치 reduce 를 통해 객체를 그룹화 할 때 처럼 넣어 버리면 위에서 언급한 object object 가 나와 버리게 된다.
- object method 를 보던 중 spread 를 통해 구현을 시킬지 실험하는 것이 다음의 학습 목표다
느낀 점
Breadth-First Search (너비 우선 탐색)
Graph
- 그래프란 연결의 집합을 모형화 한 것 이다.
- 그래프는 정점(node)와 간선(edge)로 이루어진다. 정점이 목적지다.
Breadth-First Search
-
X로 가는 최단 경로는 무엇 일까 등의 문제에 답할 수 있는 알고리즘이다.
-
두 항목 간의 최단 경로를 찾을 수 있다.
- 체커 게임에서 가장 적은 수로 승리할 수 있는 방법을 계산하는 알고리즘
- 맞춤법 검사기 (실제 단어에서 가장 적은 개수의 글자를 고쳐서 올바른 단어를 찾기)
- 가장 가까운 'x' 지점 찾기 등 (Google Map Destination?)
-
가장 적은 정류장을 거쳐 목적지에 도달하는 것을 Shortest-path Problem 이라 한다.
-
x 위치에서 y 위치로 가는 방법을 찾으려면 다음과 같은 절차가 필요하다.
- 문제를 그래프로 모형화 한다.
- 너비 우선 탐색으로 문제를 푼다.
-
너비 우선 탐색은 두 가지 종류에 대한 질문을 대답하는데 도움이 된다
- Node A 에서 Node B로 가는 경로가 존재하는가?
- Node A 에서 Node B로 가는 최단 경로는 무엇인가?
-
가장 가까운 Node 를 우선으로 쓰여진 목록에, 더해진 순서대로 탐색해야 함. 이 경우 대기열(queue) 라는 자료 구조를 씀
-
Queue 에는 삽입(enqueue) 과 제거 (dequeue) 라는 두 가지 연산이 있다.
-
먼저 삽입 된 항목이 이후에 삽입 된 항목보다 먼저 제거가 됨.
-
따라서 First in First Out 자료 구조라고도 불림.
-
Stack 은 반대로 Last In First Out
-
코드로 그래프를 구현해야 한다. 이때 각 node 간의 관계는 Hash Table 로 표시할 수 있다.
let graph = {};
{} new You = ('alice', 'bob', 'claire')
Directed Graph / Undirected Graph
- 최종 목적지를 향한 화살표는 있어도 이들로부터 누군가를 향한 화살표는 없다면 directed graph
- Undirected Graph 는 화살표를 가지지 않기 때문에 두 정점은 서로 이어져 있다.
Nodes dependency & Topological Sort
- 알고리즘이 구현되는 방식: 확인할 노드 명단을 넣을 큐를 준비
- 큐에서 한사람을 켬
- 큐에서 목적지로 도달하는 경우가 있을지 확인한다.
- 만약 목적지로 가는 중간 노드라면 작업완료
- 아니면 그 노드와 이어진 다른 노드들을 알아본다.
- 반복문
- 만약 큐가 비어있으면 네트워크에는 망고 판매상이 없다.
- 위성 정렬:
Summary
- 너비 우선 탐색은 a → b 경로를 알려줌.
- 만약 경로가 존재한다면 최단 경로도 찾아줌
- 만약 x 까지 최단 경로를 찾는 문제가 있다면 그 문제를 그래프로 모형화 해야한다.
- 방향 그래프는 화살표를 가지며 화살표 방향으로 관계를 가짐.
- 무방향 그래프는 화살표가 없고 둘 간의 상호 관계를 나타냄.
- 큐는 선입선출
- 스택은 후입선출
- 탐색 목록에 추가된 순서대로 사람을 확인해야함. 따라서 탐색목록은 큐가 되어야 한다. 그렇지 않으면 최단 경로를 구할 수 없다.
- 누군가를 확인한 다음 두번 다시 확인하지 않도록 해야한다. (directed graph). 안그러면 무한 반복에 빠짐