[선형] 14. 딕셔너리
1. 딕셔너리 (Dictionary)
- key-value 형태로 다양한 자료형 개체(Entity)를 저장하는 자료구조(Map)
- 전체 개체 획득 / 초기화 / 크기 반환 :
Dictionary.getBuffer()
,Dictionary.clear()
,Dictionary.size()
- 개체 추가 / 삭제 / 반환 / 여부 :
Dictionary.set()
,Dictionary.remove()
,Dictionary.get()
,Dictionary.has()
- key, value 배열 반환 / 고차 함수 :
Dictionary.keys()
,Dictionary.values()
,Dictionary.each()
2. 구현하기
생성자, getBuffer(), clear(), size()
// Dictionary() : 개체(Entity)를 저장할 생성자
function Dictionary(items = {}) {
this.items = items;
}
// getBuffer() : 모든 개체(Entity) 반환
Dictionary.prototype.getBuffer = function () {
return { ...this.items };
};
// clear() : 초기화
Dictionary.prototype.clear = function () {
this.items = {};
};
// size() : 크기 반환
Dictionary.prototype.size = function () {
return Object.keys(this.items).length;
};
let dict = new Dictionary({age:10, name:"alice"})
console.log(dict)//Dictionary { items: { age: 10, name: 'alice' } }
console.log(dict.getBuffer()) //{ age: 10, name: 'alice' }
console.log(dict.size()) //2
dict.clear()
console.log(dict) // Dictionary { items: {} }
has(), set(), get(), remove()
// has() : 개체 존재 여부 확인
Dictionary.prototype.has = function (key) {
return this.items.hasOwnProperty(key);
};
// set() : 개체(Entity) 추가
Dictionary.prototype.set = function (key, value) {
this.items[key] = value;
};
// get() : 개체(Entity)의 value 반환
Dictionary.prototype.get = function (key) {
return this.has(key) ? this.items[key] : undefined;
};
// remove() : 개체(Entity) 삭제
Dictionary.prototype.remove = function (key) {
if (this.has(key)) {
delete this.items[key];
return true;
}
return false;
};
let dict = new Dictionary();
dict.set("age",19)
dict.set("name","alice")
dict.set("height",180)
console.log(dict); //Dictionary { items: { age: 19, name: 'alice', height: 180 } }
dict.remove("age")
console.log(dict) //Dictionary { items: { name: 'alice', height: 180 } }
console.log(dict.has("age")) //false
console.log(dict.has("name")) //true
console.log(dict.get("age")) //undefined
console.log(dict.get("name")) //alice
keys(), values(), 고차함수
// keys() : 모든 key 값을 배열 형태로 반환
Dictionary.prototype.keys = function () {
return Object.keys(this.items);
};
// values() : 모든 value 값을 배열 형태로 반환
Dictionary.prototype.values = function () {
// let values = [];
// for (let k in this.items) {
// values.push(this.items[k]);
// }
// return values;
return Object.values(this.items);
};
Dictionary.prototype.each = function (fn) {
for (let k in this.items){
fn(k, this.items[k])
}
};
function printDictionary(key, value){
console.log(`key: ${key}`)
console.log(`value: ${value}`)
}
let dict = new Dictionary();
dict.set("age", 19);
dict.set("name", "alice");
dict.set("height", 180);
console.log(dict); //Dictionary { items: { age: 19, name: 'alice', height: 180 } }
console.log(dict.keys()) //[ 'age', 'name', 'height' ]
console.log(dict.values()) //[ 19, 'alice', 180 ]
dict.each(printDictionary)
// key: age
// value: 19
// key: name
// value: alice
// key: height
// value: 180
3. 문제 - 출석 체크
연말이 다가와 학생들에게 개근상을 주려고 한다.
학생 별 1학기 개근 현황과 2학기 개근 현황을 파악하고 이써, 이 정보를 바탕으로 학생 별 올해 1년 동안 개근을 했는지 판단하는 프로그램을 제작하시오.
개근상은 A 학생이 1학기와 2학기 모두 출석했을 경우에만 수여한다.
입력은 1학기 개근한 학생, 2학기 개근한 학생 정보가 배열로 주어지며, 1년 전체 개근한 학생은 1학기 개근한 학생 순으로 정렬하여 배열 형태로 반환한다.
function Dictionary(items = {}) {
this.items = items;
}
Dictionary.prototype.has = function (key) {
return this.items.hasOwnProperty(key);
};
Dictionary.prototype.set = function (key, value) {
this.items[key] = value;
};
function answer(class_1, class_2) {
let result = [];
// 구현
// class_2에 대한 key/value 형태로 저장 > 학생 있는지 없는지 확인
let tmp = new Dictionary();
for (let i = 0; i < class_2.length; i++) {
tmp.set(class_2[i], true);
}
// class_1 for class_2 dictionary 학생 있는지 없는지 유무를 통해 빠르게 확인
for (let i = 0; i < class_1.length; i++) {
if (tmp.has(class_1[i])) {
result.push(class_1[i]);
}
}
// 구현 종료
return result;
}
let input = [
// TC : 1
[
["Kail", "Oliber", "Naomi"],
["Oliver", "Naomi", "Maya"],
],
[
["Roxy", "Olga", "Kara", "Nana"],
["Oliver", "Roxy", "Kara", "Nana", "May"],
],
[
["Roxy", "Ravi", "Nana", "Rei", "Karis", "Mana", "Naomi"],
["Olga", "Nana", "Rei", "Oliver", "Kali", "Rei", "Kara"],
],
];
for (let i = 0; i < input.length; i++) {
process.stdout.write(`#${i + 1}`);
console.log(answer(input[i][0], input[i][1]));
}
// #1[ 'Naomi' ]
// #2[ 'Roxy', 'Kara', 'Nana' ]
// #3[ 'Nana', 'Rei' ]