Be well coding/In Immersive
7/12 - 2주 프로젝트
be well
2019. 7. 13. 18:58
Toy 25번 문제 . HashTable 해싱한 키를 인덱스로해서 찾고 삭제하고 검색한 것을 구현 성공.
var makeHashTable = function() {
var result = {};
var storage = [];
var storageLimit = 1000;
result.insert = function(key, value) {
let index = getIndexBelowMaxForKey(key, storageLimit);
// 인덱스는 저장할 key를 storageLimit범위의 값으로 해싱한 수
if (storage[index] === undefined) {
storage[index] = [[key, value]];
// 2중배열인 이유 = linked list 형식으로 저장
}
// 해시테이블에 저장이 안되어있는 경우 저장!
else {
// 이미 다른키가 있는 경우
let alreadyInserted = false;
for (let i = 0; i < storage[index].length; i++) {
if (storage[index][i][0] === key) {
storage[index][i][1] = value;
alreadyInserted = true;
}
// 값 수정하기
}
if (alreadyInserted === false) {
storage[index].push([key, value]);
}
// 해싱한 키가 같은 경우 value 배열에 인자로 추가
}
};
result.retrieve = function(key) {
let index = getIndexBelowMaxForKey(key, storageLimit);
if (storage[index] === undefined) {
// 검색해서 없으면 언디파인드
return undefined;
} else {
if (storage[index].length === 1 && storage[index][0][0] === key) {
return storage[index][0][1];
}
// 검색했는데 하나면 바로 걔 리턴
else {
for (let i = 0; i < storage[index].length; i++) {
if (storage[index][i][0] === key) {
// 여러개면 i 다 보면서 맞는애 리턴
return storage[index][i][1];
}
}
}
}
};
result.remove = function(key) {
let index = getIndexBelowMaxForKey(key, storageLimit);
if (storage[index].length === 1 && storage[index][0][0] === key) {
// 저장된 값이 하나이고 삭제할 키가 맞다면 삭제
delete storage[index];
} else {
// 저장된 값이 그 이상이면 안에서 키를 검색해서 삭제
for (let i = 0; i < storage[index]; i++) {
if (storage[index][i][0] === key) {
delete storage[index][i];
}
}
}
};
var makeHashTable = function(){
// This is a "hashing function". You don't need to worry about it, just use it
// to turn any string into an integer that is well-distributed between
// 0 and max - 1
var getIndexBelowMaxForKey = function(str, max){
var getIndexBelowMaxForKey = function(str, max) {
var hash = 0;
for (var i = 0; i < str.length; i++) {
hash = (hash<<5) + hash + str.charCodeAt(i);
hash = (hash << 5) + hash + str.charCodeAt(i);
hash = hash & hash; // Convert to 32bit integer
hash = Math.abs(hash);
}
return result;
프로젝트 진행
홈화면 제작
사용자의 onpress 마다 UI 변경 . onpress 이벤트 발생 시 state 를 변경 , UI 바뀌는 부분마다 state 에 따라서 render 되는 로직.
네비게이션 사용
기본 리액트와 다르게 screen 단위로 이동할 때 stack 식으로 이전 screen 으로 이동하거나 넘어갈 때 남아있게 할 수 있는
Stack navigaitor 를 사용했다.
createStackNavigator, createAppContainer 를 import 하고
createStackNavigator 안에서 이동할 screen 들을 명시해준다.
{ initialRouteName: "SignIn", headerMode: "none" } : render 시에 가장 먼저 띄워질 화면 생성.
그 후 자식 Component 처럼 사용한다.
외부 라이브러리 사용
Alert 가 너무 투박해서 조금 예쁜? Alert 를 찾아보다가 발견한 라이브러리인 awesome-alerts".
재밌던 점은 기본 component 처럼 위치하지만 Alert 에 위치한 버튼을 누를 때 state 를 변경해서 보이게 하거나 숨길 수 있게 관리한다.