210519 ํ ์์ผ 12~13์ผ์ฐจ
(์ธํดํ๋ฉด์ ํด๊ทผ ํ ์กฐ๊ธ์ฉ ์คํฐ๋ํ๊ณ ํ ์์ผ์ ๋ณต์ตํ๋ฉด์ ์ง๋๋ฅผ ๋๊ฐ)
# 9~11์ผ์ฐจ ๋ณต์ต
CH5 ํ
- ํ๋ ๋ฆฌ์คํธ์ ์ผ์ข ์ผ๋ก ๋๋ถ๋ถ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ฝ์ ๋๊ณ ์๋ถ๋ถ์์ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋๋ ๊ตฌ์กฐ์ด๋ค. ์ผ์ด๋ ์์๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ง๋ง ์คํ๊ณผ ๋ฐ๋๋ก ๋จผ์ ๋ค์ด์จ ์์๋๋ก ์ฒ๋ฆฌํ๋ค. ์ ์ ์ ์ถ.
- enqueue๋ ํ์ ๋๋ถ๋ถ์ ์์ ์ถ๊ฐ, dequeue๋ ํ์ ์๋ถ๋ถ์ ์์ ์ญ์ , ํ์ ์๋ถ๋ถ ์์๋ฅผ ํ์ธํ๋ peek, ์์ ๊ฐ์๋ฅผ ํ์ธํ๋ length, ์ ์ฒด ์์๋ฅผ ์ญ์ ํ๋ length, front()๋ ๋งจ ์์ ์์, back()์ ๋งจ ๋ค์ ์์๋ฅผ ๋ณด์ฌ์ค๋ค.
function Queue() {
this.dataStore = [];
this.enqueue = enqueue;
this.dequeue = dequeue;
this.front = front;
this.back = back;
this.toString = toString;
this.empty = empty;
}
function enqueue(element) {
this.dataStore.push(element);
}
function dequeue() {
return this.dataStore.shift();// ๋ฐฐ์ด ์๋ถ๋ถ์ ์ ์ฅ๋ ์์๋ฅผ ์ญ์
}
function front() {
return this.dataStore[0];
}
function back() {
return this.dataStore[this.dataStore.length - 1];
}
// ๋ชจ๋ ์์ ์ถ๋ ฅfunction toString() {
let retStr = "";
for (let i = 0; i < this.dataStore.length; ++i) {
retStr += this.dataStore[i] + "\n";
}
return retStr;
}
// ํ๊ฐ ๋น์๋์ง ํ์ธfunction empty() {
if (this.dataStore.length === 0) {
return true;
} else {
return false;
}
}
let q = new Queue();
q.enqueue("M");
q.enqueue("C");
q.enqueue("J");
console.log(q.toString());
q.dequeue();
console.log(q.toString());
console.log("Front of queue: " + q.front());
console.log("Back of queue: " + q.back());
- ํ๋ก ๋ฐ์ดํฐ ์ ๋ ฌํ๊ธฐ
ํ๋ฅผ ์ด์ฉํ์ฌ ๊ธฐ์์ ๋ ฌ์ ๊ตฌํํ ์ ์๋ค. ๊ธฐ์์ ๋ ฌ์ ๋ ๋ฒ์ ๊ณผ์ ์ ๊ฑฐ์ณ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๋ค. 0~99 ์ ์๋ฅผ ์ด์ฉํ๋ค.
function Queue() {
this.dataStore = [];
this.enqueue = enqueue;
this.dequeue = dequeue;
this.front = front;
this.back = back;
this.toString = toString;
this.empty = empty;
this.count = count;
}
function enqueue(element) {
this.dataStore.push(element);
}
function dequeue() {
return this.dataStore.shift();// ๋ฐฐ์ด ์๋ถ๋ถ์ ์ ์ฅ๋ ์์๋ฅผ ์ญ์
}
function front() {
return this.dataStore[0];
}
function back() {
return this.dataStore[this.dataStore.length - 1];
}
// ๋ชจ๋ ์์ ์ถ๋ ฅfunction toString() {
let retStr = "";
for (let i = 0; i < this.dataStore.length; ++i) {
retStr += this.dataStore[i] + "\n";
}
return retStr;
}
// ํ๊ฐ ๋น์๋์ง ํ์ธfunction empty() {
if (this.dataStore.length === 0) {
return true;
} else {
return false;
}
}
function count() {
return this.dataStore.length;
}
// @ : ํ๋ก ๋ฐ์ดํฐ ์ ๋ ฌํ๊ธฐ, ๊ธฐ์ ์ ๋ ฌ, 1์ ์๋ฆฌ ๊ธฐ์ค์ผ๋ก ์ซ์ ์ ๋ ฌ ํ 10์ ์๋ฆฌ ๊ธฐ์ค์ผ๋ก ์ซ์ ์ ๋ ฌ.// @ : ๊ฐ ์ซ์๋น 1๊ฐ์ ํ์ด๋ฏ๋ก 9๊ฐ์ ํ๊ฐ ํ์ํ๋ค.function distribute(nums, queues, n, digit) {
for (let i = 0; i < n; ++i) {
if (digit === 1) {
// @ : nums[i]%10์ด๋ฉด ํด๋น ์ซ์์ ์ผ์ ์๋ฆฌ ์ซ์๋ฅผ ๊ธฐ์ค์ผ๋ก queues[์ผ์์๋ฆฌ์ซ์]์ enqueue๋๋ค.console.log(nums[i] % 10);
queues[nums[i] % 10].enqueue(nums[i]);
} else {
// @ : Math.floor(nums[i]/10)๋ก ์ญ์ ์๋ฆฌ ์ซ์๋ฅผ ๊ตฌํ ๋ค queues[์ญ์์๋ฆฌ์ซ์]์ enqueueํ๋ค.console.log(Math.floor(nums[i] / 10));
queues[Math.floor(nums[i] / 10)].enqueue(nums[i]);
}
}
}
// @ : ํ์ ์ ์ฅ๋ ์ซ์๋ฅผ ์์งํ๋ ํจ์function collect(queues, nums) {
let i = 0;
for (let digit = 0; digit < 10; ++digit) {
while (!queues[digit].empty()) {
// @ : nums[0~10]์ queues์ ๊ธฐ์ ์ ๋ ฌํ ์ซ์๋ค์ ์ฐจ๋ก๋๋ก ๋ฃ์ด์ค, ์ผ์์๋ฆฌ์ซ์ ์ ๋ ฌ > ์ญ์์๋ฆฌ์ซ์ ์ ๋ ฌ์ ๊ธฐ์์ ๋ ฌ๋จ
nums[i++] = queues[digit].dequeue();
}
}
}
function dispArray(arr) {
for (let i = 0; i < arr.length; ++i) {
console.log(arr[i] + " ");
}
}
let queues = [];
// # : ๊ฐ ์ซ์๋น ํ ๊ฐ์ฉ 9๊ฐ์ ํ๊ฐ ํ์ํ๋ค.for (let i = 0; i < 10; ++i) {
queues[i] = new Queue();
}
let nums = [];
// # : ๋๋คํ ์ซ์ 0~99๋ฅผ ๋ง๋ค์ด nums์ ํ ๋นํ๋ค.for (let i = 0; i < 10; ++i) {
nums[i] = Math.floor(Math.floor(Math.random() * 101));
}
console.log("Before radix sort: ");
dispArray(nums);
distribute(nums, queues, 10, 1);
console.log();
collect(queues, nums);
distribute(nums, queues, 10, 10);
collect(queues, nums);
console.log("\n\nAfter radix sort: ");
dispArray(nums);
- ์ฐ์ ์์ ํ
๋ณดํต ํ์์๋ ๋จผ์ ๋ฃ์ ์์๋ถํฐ ์ญ์ ๋๋ค. ํ์ง๋ง ์ ์
์ ์ถ์ด ์๋๋ผ ์ฐ์ ์์์ ๊ฐ์ ๋ค๋ฅธ ๊ธฐ์ค์ผ๋ก ์์๋ฅผ ์ญ์ ํด์ผ ํ๋ ๊ฒฝ์ฐ๋ ์๋ค. ์ด๋ด ๋๋ ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ๋ค. ์๊ธ์ค์์๋ ํ์์ ์ํ๋ฅผ ํ๊ฐํด ์ฐ์ ์์ ์ฝ๋๋ฅผ ๋ถ์ฌํ๋ค. ์ฐ์ ์์๊ฐ ๋์ ํ์๊ฐ ๋ฎ์ ํ์๋ณด๋ค๋ ๋จผ์ ์ง๋ฃ ๋ฐ๋๋ค. code๋ ์ฐ์ ์์๋ฅผ ๋ํ๋ด๋ฉฐ ๊ฐ์ฅ ๋์ ์ฐ์ ์์๋ 1,2,3,4,,, ์์ด๋ค.(์ซ์๊ฐ ๋ฎ์์๋ก ๋๋ค.)
function Queue() {
this.dataStore = [];
this.enqueue = enqueue;
this.dequeue = dequeue;
this.front = front;
this.back = back;
this.toString = toString;
this.empty = empty;
this.count = count;
}
function enqueue(element) {
this.dataStore.push(element);
}
function dequeue() {
return this.dataStore.shift();// ๋ฐฐ์ด ์๋ถ๋ถ์ ์ ์ฅ๋ ์์๋ฅผ ์ญ์
}
function front() {
return this.dataStore[0];
}
function back() {
return this.dataStore[this.dataStore.length - 1];
}
// ๋ชจ๋ ์์ ์ถ๋ ฅfunction toString() {
let retStr = "";
for (let i = 0; i < this.dataStore.length; ++i) {
retStr += this.dataStore[i] + "\n";
}
return retStr;
}
// ํ๊ฐ ๋น์๋์ง ํ์ธfunction empty() {
if (this.dataStore.length === 0) {
return true;
} else {
return false;
}
}
function count() {
return this.dataStore.length;
}
// # : ์ฐ์ ์์ ํ// # : ์์ง ๊ฐํธ์ฌ๊ฐ ํ์ ๊ฒ์ฌ >> ํ์์ํํ๊ฐ๋ก ์ฐ์ ์์ ์ฝ๋ ๋ถ์ฌ >> ์ฐ์ ์์ ๋์ผ๋ฉด ๋จผ์ ์ง๋ฃ๋ฐ์(์ฐ์ ์์ ์ฝ๋๊ฐ ๊ฐ์ผ๋ฉด ์ ์
์ ์ถ)function Patient(name, code) {
this.name = name;
this.code = code;// ์ฐ์ ์์ or ์ฌ๊ฐ์ฑ
}
// # : ๊ฐ์ฅ ๋์ ์ฐ์ ์์(1 > 2 > 3 > 4 > ,,,) ์ญ์ function dequeue() {
let entry = 0;
for (let i = 0; i < this.dataStore.length; ++i) {
// @ : this.dataStore[entry].code๋ ๊ฐ์ฅ ์์ code(๊ฐ์ฅ ๋์ ์ฐ์ ์์)๋ก ์ ์ง๋์ด์ผ ํ๋ค.// @ : ๋ฐ๋ผ์ ์ธ๋ฑ์ค i์ผ ๋ ๋ ์์ผ๋ฉด entry=i๋ก ํ ๋นํ๋ค.if (this.dataStore[i].code < this.dataStore[entry].code) {
console.log(
"deq",
this.dataStore[i].code,
this.dataStore[entry].code
);
entry = i;
console.log("ent: ", entry);
}
}
return this.dataStore.splice(entry, 1);
}
// # : ์ถ๋ ฅfunction toString() {
let retStr = "";
for (let i = 0; i < this.dataStore.length; ++i) {
retStr +=
this.dataStore[i].name + " code: " + this.dataStore[i].code + "\n";
}
return retStr;
}
// # : worklet p = new Patient("Smith", 5);
let ed = new Queue();
ed.enqueue(p);
p = new Patient("Jones", 4);
ed.enqueue(p);
p = new Patient("Fehrenbach", 6);
ed.enqueue(p);
p = new Patient("Brown", 1);
ed.enqueue(p);
p = new Patient("Ingram", 1);
ed.enqueue(p);
console.log(ed.toString());
let seen = ed.dequeue();
console.log("Patient being treated: " + seen[0].name);
console.log("Patients waiting to be seen: ");
console.log(ed.toString());
// ๋ค์ ํ์ ์น๋ฃ
seen = ed.dequeue();
console.log("Patient being treated: " + seen[0].name);
console.log("Patients waiting to be seen: ");
console.log(ed.toString());
seen = ed.dequeue();
console.log("Patient being treated: " + seen[0].name);
console.log("Patients waiting to be seen: ");
console.log(ed.toString());
# 1. Queue ํด๋์ค๋ฅผ ๊ณ ์ณ์ Deque ํด๋์ค๋ฅผ ๋ง๋์์ค. Deque๋ ํ์ ๋น์ทํ ์๋ฃ๊ตฌ์กฐ๋ก ๋ฆฌ์คํธ์ ์๋ถ๋ถ๊ณผ ๋๋ถ๋ถ ๋ชจ๋์์ ์์์ ์ฝ์
๊ณผ ์ญ์ ๊ฐ ์ผ์ด๋๋ค. ํ๋ก๊ทธ๋จ์ ์ด์ฉํด ๊ตฌํํ Deque ํด๋์ค๋ฅผ ํ
์คํธํ์์ค.
push_front() : ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฐฐ์ด์ shift()๋ผ๋ ๋งจ ์์ ์์๋ฅผ ์ ๊ฑฐํด์ฃผ๋ ๋ฉ์๋๊ฐ ์์ด ์ด๋ฅผ ์ด์ฉํด ๊ตฌํํ์๋ค.
pop_back() : length ํ๋กํผํฐ๋ฅผ ์ด์ฉํด length-1 ์์น์ ์์๋ฅผ 1๊ฐ ์ง์ฐ๋๋ก splice ๋ฉ์๋๋ก ๊ตฌํํ์๋ค.
function Deque() {
this.dataStore = [];
this.push_front = push_front;
this.push_back = push_back;
this.pop_front = pop_front;
this.pop_back = pop_back;
this.front = front;
this.back = back;
this.toString = toString;
this.empty = empty;
}
// # : push_front() : ๋งจ ์์ ์๋ก์ด ์์๋ฅผ ์ฝ์
ํ๋ค.// # : push_back() : ๋งจ ๋ค์ ์๋ก์ด ์์๋ฅผ ์ฝ์
ํ๋ค.// # : pop_front() : ๋งจ ์์ ์์๋ฅผ ์ ๊ฑฐํ๋ค.// # : pop_back() : ๋งจ ๋ค์ ์์๋ฅผ ์ ๊ฑฐํ๋ค.// ! : splice(๋งจ ์ ์ธ๋ฑ์ค, 0, ์ถ๊ฐํ๋ ค๋ ์์)๋ฅผ ์ด์ฉํ๋ค. ๋ ๋ฒ์งธ ์ธ์์ ๊ธธ์ด๋งํผ ์ญ์ ํ์ง๋ง 0์ด๋ฉด ์ถ๊ฐ.function push_front(element) {
this.dataStore.splice(0, 0, element);
}
function push_back(element) {
this.dataStore.push(element);
}
function pop_front() {
return this.dataStore.shift();// ๋ฐฐ์ด ์๋ถ๋ถ์ ์ ์ฅ๋ ์์๋ฅผ ์ญ์
}
// ! : backํจ์์์ length-1์ ์ฌ์ฉํ๋ฏ ๋งจ ๋ค์ ์์์ ๋ํ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ ธ์์ ํด๋น ์ธ๋ฑ์ค๋ฅผ splice๋ก ์ญ์ ํ๋ค.function pop_back() {
return this.dataStore.splice(this.dataStore.length - 1, 1);// ๋ฐฐ์ด ์๋ถ๋ถ์ ์ ์ฅ๋ ์์๋ฅผ 1๊ฐ ์ญ์
}
function front() {
return this.dataStore[0];
}
function back() {
return this.dataStore[this.dataStore.length - 1];
}
// ๋ชจ๋ ์์ ์ถ๋ ฅfunction toString() {
let retStr = "";
for (let i = 0; i < this.dataStore.length; ++i) {
retStr += this.dataStore[i] + "\n";
}
return retStr;
}
// ํ๊ฐ ๋น์๋์ง ํ์ธfunction empty() {
if (this.dataStore.length === 0) {
return true;
} else {
return false;
}
}
let dq = new Deque();
dq.push_front("M");
dq.push_front("C");
dq.push_front("J");
console.log(dq.toString());
dq.pop_front();
console.log(dq.toString());
dq.pop_back();
console.log(dq.toString());
dq.push_back("A");
dq.push_back("B");
console.log(dq.toString());
console.log("Front of dequeue: " + dq.front());
console.log("Back of dequeue: " + dq.back());
- ์ฐ์ ์์ ํ๋ฅผ ๋ฎ์ ์๊ฐ ์๋๋ผ ๋์ ์ซ์๋ฅผ ๋์ ์ฐ์ ์์๋ก ๊ฐ๋๋ก ๊ตฌํํ์์ค.
entry๋ฅผ ๊ฐ์ฅ ๋์ ์ซ์๊ฐ ๋ค์ด์๋ ์ธ๋ฑ์ค๋ก ์ ์ง๋์ด์ผ ํ๋ค.
function Queue() {
this.dataStore = [];
this.enqueue = enqueue;
this.dequeue = dequeue;
this.front = front;
this.back = back;
this.toString = toString;
this.empty = empty;
this.count = count;
}
function enqueue(element) {
this.dataStore.push(element);
}
function dequeue() {
return this.dataStore.shift();// ๋ฐฐ์ด ์๋ถ๋ถ์ ์ ์ฅ๋ ์์๋ฅผ ์ญ์
}
function front() {
return this.dataStore[0];
}
function back() {
return this.dataStore[this.dataStore.length - 1];
}
// ๋ชจ๋ ์์ ์ถ๋ ฅfunction toString() {
let retStr = "";
for (let i = 0; i < this.dataStore.length; ++i) {
retStr += this.dataStore[i] + "\n";
}
return retStr;
}
// ํ๊ฐ ๋น์๋์ง ํ์ธfunction empty() {
if (this.dataStore.length === 0) {
return true;
} else {
return false;
}
}
function count() {
return this.dataStore.length;
}
// # : ์ฐ์ ์์ ํ// # : ์์ง ๊ฐํธ์ฌ๊ฐ ํ์ ๊ฒ์ฌ >> ํ์์ํํ๊ฐ๋ก ์ฐ์ ์์ ์ฝ๋ ๋ถ์ฌ >> ์ฐ์ ์์ ๋์ผ๋ฉด ๋จผ์ ์ง๋ฃ๋ฐ์(์ฐ์ ์์ ์ฝ๋๊ฐ ๊ฐ์ผ๋ฉด ์ ์
์ ์ถ)function Patient(name, code) {
this.name = name;
this.code = code;// ์ฐ์ ์์ or ์ฌ๊ฐ์ฑ
}
// ! : ๊ฐ์ฅ ๋์ ์ฐ์ ์์(,,, > 4 > 3 > 2 > 1) ์ญ์ function dequeue() {
let entry = 0;
for (let i = 0; i < this.dataStore.length; ++i) {
if (this.dataStore[i].code > this.dataStore[entry].code) {
console.log(
"deq",
this.dataStore[i].code,
this.dataStore[entry].code
);
entry = i;
console.log("ent: ", entry);
}
}
return this.dataStore.splice(entry, 1);
}
// # : ์ถ๋ ฅfunction toString() {
let retStr = "";
for (let i = 0; i < this.dataStore.length; ++i) {
retStr +=
this.dataStore[i].name + " code: " + this.dataStore[i].code + "\n";
}
return retStr;
}
// # : worklet p = new Patient("Smith", 5);
let ed = new Queue();
ed.enqueue(p);
p = new Patient("Jones", 4);
ed.enqueue(p);
p = new Patient("Fehrenbach", 6);
ed.enqueue(p);
p = new Patient("Brown", 1);
ed.enqueue(p);
p = new Patient("Ingram", 1);
ed.enqueue(p);
console.log(ed.toString());
let seen = ed.dequeue();
console.log("Patient being treated: " + seen[0].name);
console.log("Patients waiting to be seen: ");
console.log(ed.toString());
// ๋ค์ ํ์ ์น๋ฃ
seen = ed.dequeue();
console.log("Patient being treated: " + seen[0].name);
console.log("Patients waiting to be seen: ");
console.log(ed.toString());
seen = ed.dequeue();
console.log("Patient being treated: " + seen[0].name);
console.log("Patients waiting to be seen: ");
console.log(ed.toString());
# 12~13์ผ์ฐจ ํ์ต
CH6 ์ฐ๊ฒฐ ๋ฆฌ์คํธ
์ํฉ์ ๋ฐ๋ผ ๋ฐฐ์ด๋ณด๋ค๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๊ฐ ๋ ์ ์ฉํ ์๋ ์๋ค.
6.1 ๋ฐฐ์ด์ ๋จ์
๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ ๋ฐฐ์ด์ด ๊ธธ์ด๊ฐ ์ ํด์ ธ ์์ด์ ๋ฐฐ์ด์ด ๊ฝ ์ฐจ๋ฉด ์ถ๊ฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ๊ธฐ๊ฐ ์ด๋ ต๋ค. ๋ฐฐ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ ๋๋ ๋๋จธ์ง ์์๋ฅผ ์ด๋ํด์ผ ํ๋ฏ๋ก ์ด๋ ค์์ด ๋ฐ๋ฅธ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฐฐ์ด์ split()์ ์ด์ฉํ๋ฉด ๊ฐ๋จํ๋ค.
ํ์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฐฐ์ด์ ๊ฐ์ฒด๋ผ์ C++์ด๋ ์๋ฐ๋ณด๋ค ๋ฐฐ์ด์ ํจ์จ์ด ๋จ์ด์ง๋ค.
๋ฐฐ์ด๋ก ์์
ํ์ ๋ ๋๋ฌด ๋๋ฆฌ๋ค๊ณ ํ๋จ๋๋ฉด ์ฌ์ฉํ ์ ์๋ค. ์ผ์ฐจ์์ ๋ฐฐ์ด์ ์ฌ์ฉํ ๊ณณ ๋๋ถ๋ถ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ๋ฐ๊ฟ ์ ์๋ค. ๋ค๋ง ์์์ ์์์ ์ ๊ทผํด์ผ ํ ๋๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ณด๋ค๋ ๋ฐฐ์ด์ด ๋ซ๋ค.
6.2 ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์ ์
node(๋
ธ๋)๋ผ ๋ถ๋ฆฌ๋ ๊ฐ์ฒด๊ฐ ๋ชจ์ฌ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๊ตฌ์ฑํ๋ค. ๊ฐ ๋
ธ๋๋ ๊ฐ์ฒด ๋ ํผ๋ฐ์ค๋ฅผ ํตํด ๋ฆฌ์คํธ์ ๋ค๋ฅธ ๋
ธ๋์ ์ฐ๊ฒฐ๋๋ค. ๋ค๋ฅธ ๋
ธ๋๋ฅผ ์ฐธ์กฐํ๋ ๋ ํผ๋ฐ์ค๋ฅผ Link๋ผ๊ณ ํ๋ค.
์ธ๋ฑ์ค๋ก ์์๋ฅผ ์ฐธ์กฐํ ์ ์๋ ๋ฐฐ์ด๊ณผ ๋ฌ๋ฆฌ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์์๋ ๋ค๋ฅธ ์์์์ ๊ด๊ณ๋ฅผ ํตํด ์ํ๋ ์์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, Bread๊ฐ ๋ ๋ฒ์งธ ์์น์ ์๋ค๋ผ๊ณ ํํํ๋ ๊ฒ ์๋๋ผย "Milk" ๋ค์์ "Bread"๊ฐ ์๋ค๋ผ๊ณ ํํํ๋ค.ย ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์๋ ์ฒซ ๋ฒ์งธ ๋
ธ๋์์ ๋ง์ง๋ง ๋
ธ๋๋ก ์ด๋ํ๋ ๋ฐฉ์์ผ๋ก ์ ์ฒด ์์๋ฅผ ํ์ธํ ์ ์๋ค.(์ข
์ข
์ฐ๊ฒฐ ๋ฆฌ์คํธ์์๋ย Head ๋
ธ๋๋ฅผ ์์์ ์ผ๋ก ์ฌ์ฉํ๋๋ฐ ์ฌ๊ธฐ์๋ ์ด ๋
ธ๋๋ ๋ฐฉ๋ฌธ ๋์์์ ์ ์ธํ๋ค.) ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋ง์ง๋ง์ Null๋ก ๋๋๋๋ฐ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋์ ๊ฐ๋ฆฌํจ๋ค.
์ย ๋
ธ๋๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ์ฝ์
ํ๋ ค๋ ๋
ธ๋์ ์ด์ ๋
ธ๋(previous node) ๋งํฌ๊ฐ ์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ๋ฐ๊ฟ์ผ ํ๊ณ ์ ๋
ธ๋์ ๋งํฌ๋ ์ด์ ๋
ธ๋๊ฐ ๊ฐ๋ฆฌํค๋ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์ค์ ํด์ผ ํ๋ค.
์๋๋ "Eggs" ๋ค๋ก "Cookies"๋ผ๋ ๋
ธ๋๋ฅผ ์ถ๊ฐํ ๋ชจ์ต์ด๋ค.
์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ํญ๋ชฉ์ ์ญ์ ํ๋ ์ผ๋ ๊ฐ๋จํ ํธ์ด๋ค. ์ญ์ ํ๋ ค๋ ๋
ธ๋์ ์ด์ ์ ์๋ ๋
ธ๋ ๋งํฌ๋ฅผ ์ญ์ ํ๋ ค๋ ๋
ธ๋๊ฐ ๊ฐ๋ฆฌํค๋ ๋
ธ๋๋ก ๋ฐ๊พผ ๋ค์, ์ญ์ ํ๋ ค๋ ๋
ธ๋์ ๋งํฌ๋ฅผ Null๋ก ์ค์ ํ๋ฉด ๋
ธ๋๊ฐ ์ญ์ ๋๋ค.
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๋ค๋ฅธ ๋ค์ํ ํจ์๋ ์ ๊ณตํ๋ค. ์ด ์ค ํนํ ์ฝ์
๊ณผ ์ญ์ ๋์์ ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๊ฐ ์ ์ฉํ์ง ๊ฐ์ฅ ๋ช
ํํ๊ฒ ๋ณด์ฌ์ค๋ค.
6.3 ๊ฐ์ฒด ๊ธฐ๋ฐ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์ค๊ณ
์ฐ๊ฒฐ ๋ฆฌ์คํธ์์๋ ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค. ์ฐ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์ถ๊ฐํ ์ ์๋ Node ํด๋์ค์ LinkedList ํด๋์ค๋ฅผ ๋ง๋ ๋ค. LinkedList ํด๋์ค๋ ๋
ธ๋์ ์ฝ์
, ์ญ์ , ๋ฆฌ์คํธ ์ถ๋ ฅ, ๊ธฐํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ํ์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
6.3.1 Node ํด๋์ค
Node ํด๋์ค๋ ๋
ธ๋์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ element์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋ค์ ๋
ธ๋ ๋งํฌ๋ฅผ ์ ์ฅํ๋ next, ๋ ๊ฐ์ง ํ๋กํผํฐ๋ฅผ ํฌํจํ๋ค.
// # : ๋
ธ๋ ํด๋์คfunction Node(element) {
this.element = element;
this.next = null;
}
6.3.2 ์ฐ๊ฒฐ ๋ฆฌ์คํธ ํด๋์ค
LList ํด๋์ค๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. LList ํด๋์ค๋ ์ ๋
ธ๋์ ์ฝ์
, ๊ธฐ์กด ๋
ธ๋ ์ญ์ , ๋ฆฌ์คํธ์ ํน์ ๋ฐ์ดํฐ ๊ฒ์ ๋ฑ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉํ ์์ฑ์ ํจ์๋ ์ ๊ณตํ๋ค. ์ฐ๊ฒฐ ๋ฆฌ์คํธ์๋ ๋ฆฌ์คํธ์ ํค๋๋ฅผ ๋ํ๋ด๋ ๋
ธ๋์ ํด๋นํ๋ ํ ๊ฐ์ ํ๋กํผํฐ๋ง ํฌํจํ๋ค.
// # : ์ฐ๊ฒฐ ๋ฆฌ์คํธ ํด๋์คfunction LList() {
this.head = new Node("head");
this.find = find;
this.insert = insert;
this.findPrevious = findPrevious;
this.remove = remove;
this.display = display;
}
์ด๊ธฐ์๋ head ๋
ธ๋์ next ํ๋กํผํฐ๋ฅผ null๋ก ์ค์ ํ๋ค. ๋ฆฌ์คํธ์ ๋
ธ๋๊ฐ ์ถ๊ฐ๋๋ฉด ๋์ค์ next ํ๋กํผํฐ์ ๊ฐ์ ๋ฐ๊พผ๋ค.
6.3.3 ์๋ก์ด ๋ ธ๋ ์ฝ์ ํ๊ธฐ
๊ธฐ์กด ๋
ธ๋์ ๋ค์ ์ ๋
ธ๋๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด '๊ธฐ์กด' ๋
ธ๋๋ฅผ ์ฐพ์์ผ ํ๋ค. ๋ฐ๋ผ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์ ํน์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ๋
ธ๋๋ฅผ ๊ฒ์ํ๋ ํฌํผ ํจ์ find()๋ฅผ ๊ตฌํํ๋ค.
// # : ์๋ก์ด ๋
ธ๋ ์ถ๊ฐํ๊ธฐ : ๊ธฐ์กด ๋
ธ๋ ๋ค๋ผ๊ณ ๊ฐ์ , ๊ธฐ์กด ๋
ธ๋๋ฅผ ์ฐพ์์ผ ํ๋ค.(find) ์ฐพ์ผ๋ฉด ํด๋น ๋
ธ๋๋ฅผ ๋ฐํํ๋ค.function find(item) {
let currNode = this.head;
// ! : ์ฐ์ ์ ๋
ธ๋๋ฅผ ๋ง๋ค๊ณ head ๋
ธ๋๋ก ์ค์ while (currNode.element !== item) {
// ! : ๋ค์ ๋
ธ๋๋ก ๋ฐ๋ณต ์ด๋ํ๋ฉด์ ํ์ฌ ๋
ธ๋์ element ํ๋กํผํฐ๊ฐ ํ์ํ๋ ค๋ ๊ฐ๊ณผ ๊ฐ์ ๊ฐ์ ํฌํจํ๋์ง ํ์ธํ๋ค.// ! : ๊ธฐ์กด ๋
ธ๋๋ฅผ ์ฐพ์ผ๋ฉด ์ ๋
ธ๋์ next ํ๋กํผํฐ๋ฅผ ๊ธฐ์กด ๋
ธ๋์ next ํ๋กํผํฐ์ ๊ฐ์ผ๋ก ์ค์ ํ๋ค.
currNode = currNode.next;
}
return currNode;
}
head ๋
ธ๋๋ก ์ ๋
ธ๋๋ฅผ ์ค์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ย ๋ค์ ๋
ธ๋๋ก ๋ฐ๋ณต ์ด๋ํ๋ฉด์ ํ์ฌ ๋
ธ๋์ element ํ๋กํผํฐ๊ฐ ํ์ํ๋ ค๋ ๊ฐ๊ณผ ๊ฐ์ ๊ฐ์ ํฌํจํ๋์ง ํ์ธํ๋ค.ย ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ผ๋ฉด ํด๋น ๋
ธ๋๋ฅผ ๋ฐํํ๋ค.ย ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ง ๋ชปํ์ผ๋ฉด null์ ๋ฐํํ๋ค.
'๊ธฐ์กด' ๋
ธ๋๋ฅผ ์ฐพ์์ผ๋ฉด ์ ๋
ธ๋์ next ํ๋กํผํฐ๋ฅผ '๊ธฐ์กด' ๋
ธ๋์ next ํ๋กํผํฐ ๊ฐ์ผ๋ก ์ค์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ '๊ธฐ์กด' ๋
ธ๋์ next ํ๋กํผํฐ๋ฅผ ์ ๋
ธ๋์ next ํ๋กํผํฐ๋ก ์ค์ ํ๋ค.
function insert(newElement, item) {
let newNode = new Node(newElement);
let current = this.find(item);
newNode.next = current.next;
newNode.previous = current;
current.next = newNode;
}
์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์์๋ฅผ ์ถ๋ ฅํ๋ ํจ์
function display() {
let currNode = this.head;
while (!(currNode.next === null)) {
console.log(currNode.next.element);
currNode = currNode.next;
}
}
6.3.4 ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์ ๋ ธ๋ ์ญ์ ํ๊ธฐ
์ฐ๊ฒฐ ๋ฆฌ์คํธ์์ ๋
ธ๋๋ฅผ ์ญ์ ํ๋ ค๋ฉด ๋ฐ๋ก ์ด์ ๋
ธ๋๋ฅผ ์ฐพ์์ผ ํ๋ค. ์ด์ ๋
ธ๋๋ฅผ ์ฐพ์์ผ๋ฉด ์ด์ ๋
ธ๋์ next ํ๋กํผํฐ๋ฅผ ์ญ์ ํ๋ ค๋ ๋
ธ๋์ ๋ค์ ๋
ธ๋๋ก ์ค์ ํด์ผ ํ๋ค. findPrevious()๋ ๋ค์ ๋
ธ๋์์ ์ญ์ ํ๋ ค๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉด ํ์์ ๋ฉ์ถ๋ค. ์ญ์ ํ๋ ค๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์์ผ๋ฉด ์ญ์ ํ๋ ค๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ๋
ธ๋์ ์ด์ ๋
ธ๋๋ฅผ ๋ฐํํ๋ค. ๊ทธ๋์ผ๋ง ์ด์ ๋
ธ๋์ next ํ๋กํผํฐ๋ฅผ ๊ณ ์น ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
// # : ์ฐ๊ฒฐ๋ฆฌ์คํธ์์ ๋
ธ๋ ์ญ์ ํ๋ ค๋ฉด ์ญ์ ํ๋ ค๋ ๋ฐ๋ก ์ด์ ๋
ธ๋๋ฅผ ์ฐพ์์ผ ํ๋ค. ์ด์ ๋
ธ๋๋ฅผ ์ฐพ์์ผ๋ฉด ์ด์ ๋
ธ๋์ next๋ฅผ ์ญ์ ํ๋ ค๋ ๋
ธ๋์ ๋ค์ ๋
ธ๋๋ก ์ค์ ํด์ผ ํ๋ค.function findPrevious(item) {
let currNode = this.head;
while (!(currNode.next === null) && currNode.next.element !== item) {
currNode = currNode.next;
}
return currNode;
}
function remove(item) {
let prevNode = this.findPrevious(item);
if (!(prevNode.next === null)) {
prevNode.next = prevNode.next.next;
}
}
prevNode.next = prevNode.next.next ๋ ์ญ์ ํ๋ ค๋ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค์ง ์๋๋ก ์ด์ ๋
ธ๋์ ๋งํฌ๋ฅผ ์ฐํ์์ผ ์ํ๋ ๋
ธ๋๋ฅผ ์ญ์ ํ๋ค.
6.4 ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ์ฒ์๋ถํฐ ๋ง์ง๋ง ๋
ธ๋๊น์ง ์ฝ๊ฒ ํ์ํ ์ ์๋ค. ํ์ง๋ง ์ญ๋ฐฉํฅ์ผ๋ก ๋
ธ๋๋ฅผ ํ์ํ๋ ๊ฒ์ ์ฝ์ง ์๋ค. ๋
ธ๋์ ์ด์ ๋
ธ๋์ ๋งํฌ๋ฅผ ์ ์ฅํ๋ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋ค. ํ์ง๋ง ๋งํฌ๋ฅผ ์ถ๊ฐํ๋ฉด ๋
ธ๋ ์ถ๊ฐํ ๋ ๋ ๋ง์ ์์
์ ํด์ผ ํ๋ค. ๋์ ๋
ธ๋๋ฅผ ์ญ์ ํ ๋๋ ๋ ์ด์ ์ด์ ๋
ธ๋๋ฅผ ์ฐพ์ ํ์๊ฐ ์์ด ์ข ๋ ๊ฐ๋จํด์ง๋ค.
function Node(element) {
this.element = element;
this.next = null;
this.previous = null;
}
insert ํจ์๋ ์ ๋
ธ๋์ previous ํ๋กํผํฐ๋ฅผ ์ด์ ๋
ธ๋๋ก ์ค์ ํด์ผ ํ๋ค.
function insert(newElement, item) {
let newNode = new Node(newElement);
let current = this.find(item);
newNode.next = current.next;
newNode.previous = current;
current.next = newNode;
}
์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ remove ํจ์๋ ์ด์ ๋
ธ๋๋ฅผ ์ฐพ์ ํ์๊ฐ ์์ผ๋ฏ๋ก ์ข๋ ๊ฐ๋จํ๋ฐ ์ฐ์ ์ญ์ ํ๋ ค๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ๋
ธ๋๋ฅผ ์ฐพ๋๋ค. ๊ทธ๋ฆฌ๊ณ ย ์ญ์ ํ๋ ค๋ ๋
ธ๋ ์ด์ ๋
ธ๋์ next ํ๋กํผํฐ๋ฅผ ์ญ์ ํ๋ ค๋ ๋
ธ๋์ next ๊ฐ์ผ๋ก,ย ์ญ์ ํ๋ ค๋ ๋
ธ๋ ๋ค์ ๋
ธ๋์ previous ํ๋กํผํฐ๋ฅผ ์ญ์ ํ๋ ค๋ ๋
ธ๋์ previous ๊ฐ์ผ๋ก ๊ฐ๊ฐ ์ค์ ํ๋ค.
function remove(item) {
let currNode = this.find(item);
if (!(currNode.next === null)) {
currNode.previous.next = currNode.next;
currNode.next.previous = currNode.previous;
currNode.next = null;
currNode.previous = null;
}
}
์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ย ๋ง์ง๋ง ๋
ธ๋๋ก ์ด๋ํ๋ ์ ํธ๋ฆฌํฐ ํจ์๋ฅผ ์ด์ฉํด ์ญ์์ผ๋ก ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅํ๋ ๋์์ ์ํํ ์ ์๋ค.
// # : ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ "๋ง์ง๋ง ๋
ธ๋๋ก ์ด๋ํ๋ ์ ํธ๋ฆฌํฐ ํจ์"๋ฅผ ์ด์ฉํด ์ญ์์ผ๋ก ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅํ๋ ๋์์ ์ํํ ์ ์๋ค.function findLast() {
let currNode = this.head;
while (!(currNode.next === null)) {
currNode = currNode.next;
}
return currNode;
}
findLast ํจ์๋ฅผ ์ด์ฉํ๋ฉด ์ญ์์ผ๋ก ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์์๋ฅผ ์ถ๋ ฅํ ์ ์๋ค.
// # : ์ญ์์ผ๋ก ์๋ฐฉํฅ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ์์ ์ถ๋ ฅfunction dispReverse() {
let currNode = this.findLast();
while (!(currNode.previous === null)) {
console.log(currNode.element);
currNode = currNode.previous;
}
}
6.5 ์ํํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
์ํํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๋จ๋ฐฉํฅ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๊ฐ์ ์ข
๋ฅ์ ๋
ธ๋๋ฅผ ํฌํจํ๋ค. ์ ์ผํ๊ฒ ๋ค๋ฅธ ์ ์ ์ํํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์๋ ํค๋์ next ํ๋กํผํฐ๊ฐ ์์ ์ ๊ฐ๋ฆฌํจ๋ค๋ ๊ฒ์ด๋ค.
head.next = head;๋ ์ ์ฒด ๋ฆฌ์คํธ์ ์ ์ฉ๋์ด ํญ์ ๋ง์ง๋ง ๋
ธ๋์ next ํ๋กํผํฐ๋ ํค๋๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
๋ณต์กํ ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ง ์๊ณ ๊ฐ๋จํ๊ฒ ์ญ๋ฐฉํฅ์ผ๋ก ํ์ํ ์ ์๋ค๋ ๊ฒ์ด ๊ฐ์ ์ด๋ค. ์ํํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์๋ ๋
ธ๋์ ๋์ ์ง๋ ๊ณ์ ํ์ํ๋ฉด ๊ฒฐ๊ตญ ์ญ๋ฐฉํฅ์ ์๋ ๋
ธ๋๋ก ์ด๋ํ ์ ์๋ค.
function LList() {
this.head = new Node("head");
this.head.next = this.head;
this.find = find;
this.insert = insert;
this.display = display;
this.findPrevious = findPrevious;
this.remove = remove;
}
display() ํจ์๋ ์ํํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์ฌ์ฉํ๋ ค๋ฉด while ๋ฃจํ ์คํ ์กฐ๊ฑด์ ํค๋์์ ๋ฉ์ถ๋๋ก ๋ฐ๊ฟ์ผ ํ๋ค.
function display() {
let currNode = this.head;
while (!(currNode.next === null) && !(currNode.next.element == "head")) {
console.log(currNode.next.element);
currNode = currNode.next;
}
}
6.6 ๊ธฐํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ํจ์
- advance(n)ย : ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์ n ๋ ธ๋๋งํผ ์ ์ง
- back(n)ย : ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์ n ๋ ธ๋๋งํผ ๋ค๋ก ํ์ง
- show()ย : ํ์ฌ ๋ ธ๋๋ง ์ถ๋ ฅ
6.7 ์ฐ์ต๋ฌธ์
1. advance(n) ํจ์๋ฅผ ๊ตฌํํ์์ค. advance(n) ํจ์๋ฅผ ํธ์ถํ๋ฉด ํ์ฌ ๋
ธ๋๊ฐ n ๋
ธ๋๋งํผ ์ ์งํ๋ค.
advance(n)์ย insert(newElement, item)ย ํจ์์์ let current = this.find(item)์ผ๋ก ๊ธฐ์กด ๋
ธ๋๋ฅผ ์ฐพ์์์ ๋ ํด๋น ๋
ธ๋(current)์ n ๋
ธ๋๋งํผ ์ ์ง์ํค๋ ๊ธฐ๋ฅ์ ๊ฐ์ง ํจ์๋ก ํด์ํ์ฌ ๊ตฌํํ์๋ค. ๋จ๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์๋ this.head๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์ํ๊ธฐ ๋๋ฌธ์ ํ์ฌ ๋
ธ๋๋ฅผ ๋ฐ์์ฃผ์ด์ผ ํ๋๋ฐ insert์์๋ง ์ด๋ ๊ฒ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
=> ์ฒ์์๋ ์ ์งํ๋ค๋ ๊ฒ์ด ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์ผ์ชฝ์ผ๋ก ์ด๋ํ๋ ๊ฒ์ ๋ปํ๋ค๊ณ ์๊ฐํ๋๋ฐ ์ฐพ์๋ณด๋ ๋จ๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ํน์ฑ์ prevNode๋ฅผ ์ ์ ์๊ธฐ๋ ํ๊ณ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋์ํค๋ ๊ฒ์์ ์๊ฒ ๋์๋ค.
=> ๋ฐ๋ผ์ย ์ ์ง์ด๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ๋ ๊ฒ์ ๋ปํ๋ฉฐย head(๋งจ ์) ๋
ธ๋๋ถํฐ n ๋
ธ๋๋งํผ ์ ์งํ๋๋ก ๊ตฌํํ๋ ๊ฒ์ด ๋ง๋ค๊ณ ์๊ฐํด์ ๋ค์ ์ค๊ณํ๋ค.
// # : 1. advance(n) ํจ์๋ฅผ ๊ตฌํํ์์ค. advance(n) ํจ์๋ฅผ ํธ์ถํ๋ฉด ํ์ฌ ๋
ธ๋๊ฐ n ๋
ธ๋๋งํผ ์ ์งํ๋ค.function Node(element) {
this.element = element;
this.next = null;
}
function LList() {
this.head = new Node("head");
this.find = find;
this.insert = insert;
this.findPrevious = findPrevious;
this.remove = remove;
this.advance = advance;
this.display = display;
}
function find(item) {
let currNode = this.head;
while (currNode.element !== item) {
currNode = currNode.next;
}
return currNode;
}
function insert(newElement, item) {
let newNode = new Node(newElement);
let current = this.find(item);
newNode.next = current.next;
current.next = newNode;
}
function display() {
let currNode = this.head;
while (!(currNode.next === null)) {
console.log(currNode.next.element);
currNode = currNode.next;
}
}
function findPrevious(item) {
let currNode = this.head;
while (!(currNode.next === null) && currNode.next.element !== item) {
currNode = currNode.next;
}
return currNode;
}
function remove(item) {
let prevNode = this.findPrevious(item);
if (!(prevNode.next === null)) {
prevNode.next = prevNode.next.next;
}
}
function advance(n) {
let currNode = this.head;
for (let i = 0; i < n; ++i) {
if (!(currNode.next === null)) {
console.log("if O , next ์์", currNode.next.element);
currNode = currNode.next;
}
}
return currNode;
}
let cities = new LList();
cities.insert("Con", "head");
cities.insert("Rus", "Con");
cities.insert("Car", "Rus");
cities.insert("Alm", "Car");
cities.display();
console.log();
console.log("adv 3 : ", cities.advance(3));
console.log();
cities.display();
2. back(n) ํจ์๋ฅผ ๊ตฌํํ์์ค. back(n) ํจ์๋ฅผ ํธ์ถํ๋ฉด ํ์ฌ ๋
ธ๋๊ฐ n ๋
ธ๋๋งํผ ํ์งํ๋ค.
๋จ๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ ๊ฒ ์๋๋ผ ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ๊ตฌํํด์ผ ํ๋ ๊ฒ ๊ฐ์๋ฐ 6.6์ ์ค๋ช
์์๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ผ๊ณ ํ๋ค.
=> ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ๊ตฌํํ๋ค.
์ญ์์ผ๋ก ์ถ๋ ฅ๋ ๊ฒ์ ๋ณด๋ฉด Alm์ด ๋งจ ์์ ์์๊ณ back()์ ํจ์๊ฐ ํธ์ถ๋ ๋ ๋งจ ๋ค์ ์์๊ฐ Alm์ด๋ค. Alm์์ 2๋ฒ ํ์ง์์ผฐ์ผ๋ฏ๋ก Run์ด ๋๋ค.
function Node(element) {
this.element = element;
this.next = null;
this.previous = null;
}
function LList() {
this.head = new Node("head");
this.find = find;
this.insert = insert;
this.display = display;
this.remove = remove;
this.findLast = findLast;
this.dispReverse = dispReverse;
this.back = back;
}
function insert(newElement, item) {
let newNode = new Node(newElement);
let current = this.find(item);
newNode.next = current.next;
newNode.previous = current;
current.next = newNode;
}
function remove(item) {
let currNode = this.find(item);
if (!(currNode.next === null)) {
currNode.previous.next = currNode.next;
currNode.next.previous = currNode.previous;
currNode.next = null;
currNode.previous = null;
}
}
// # : ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ "๋ง์ง๋ง ๋
ธ๋๋ก ์ด๋ํ๋ ์ ํธ๋ฆฌํฐ ํจ์"๋ฅผ ์ด์ฉํด ์ญ์์ผ๋ก ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅํ๋ ๋์์ ์ํํ ์ ์๋ค.function findLast() {
let currNode = this.head;
while (!(currNode.next === null)) {
currNode = currNode.next;
}
return currNode;
}
// # : ์ญ์์ผ๋ก ์๋ฐฉํฅ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ์์ ์ถ๋ ฅfunction dispReverse() {
let currNode = this.findLast();
while (!(currNode.previous === null)) {
console.log(currNode.element);
currNode = currNode.previous;
}
}
function display() {
let currNode = this.head;
while (!(currNode.next === null)) {
console.log(currNode.next.element);
currNode = currNode.next;
}
}
function find(item) {
let currNode = this.head;
while (currNode.element != item) {
currNode = currNode.next;
}
return currNode;
}
function back(n) {
let currNode = this.findLast();
console.log("๋งจ๋ค์์:", currNode);
for (let i = 0; i < n; ++i) {
if (!(currNode.previous === null)) {
currNode = currNode.previous;
}
}
return currNode;
}
let cities = new LList();
cities.insert("Con", "head");
cities.insert("Run", "Con");
cities.insert("Car", "Run");
cities.insert("Alm", "Car");
console.log("์ญ์ ์ถ๋ ฅ");
cities.dispReverse();
console.log();
console.log("๋งจ ๋ค์ ์์๋ถํฐ back 2 : ", cities.back(2));
3. ํ์ฌ ๋
ธ๋์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ show() ํจ์๋ฅผ ๊ตฌํํ์์ค.
function show() {
let currNode = this.head;
return currNode.element
}
let cities = new LList();
cities.insert("Con", "head");
cities.insert("Run", "Con");
cities.insert("Car", "Run");
cities.insert("Alm", "Car");
cities.display();
console.log();
console.log("ํ์ฌ ๋
ธ๋ : ",cities.show());
4. ๋ํํ์ผ๋ก ์
๋ ฅ๋ ํ
์คํธ ์ ์๋ฅผ ๋จ๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ์ ์ฅํ๋ ํ๋ก๊ทธ๋จ์ ๊ตฌํํ์์ค.
score๋ฅผ ์
๋ ฅํ์ฌ "head'์ ๋ค์ ์์น์ insertํ๋๋ก ๊ตฌํํ๋๋ฐ ์ฐ์์ ์ผ๋ก ์
๋ ฅ ๋ฐ๊ธฐ ์ํด์๋ nodejs์์ ๋ํํ ๊ตฌํ์ ๋ํด์ ๋ ์์๋ด์ผ ํ๋ค. ์๋นํ ๋ถํธํ๊ฒ ๋์ด ์๋ค.
์ฒ์์๋ "head"์ ๋ค์ ์ ์๋ฅผ ์ ์ฅ์์ผ์ค ๋ค์ if๋ฌธ์ผ๋ก scores(์ฐ๊ฒฐ ๋ฆฌ์คํธ)์ ๋ง์ง๋ง ์์๊ฐ null์ด ์๋ ๋ ์๋ก์ด ์์๋ฅผ ๊ทธ ๋ค๋ก ์ ์ฅํด์ฃผ๋ ๋ฐฉ์์ ์ฌ์ฉํ ๊ฒ ๊ฐ๋ค.
// # : 4. ๋ํํ์ผ๋ก ์
๋ ฅ๋ ํ
์คํธ ์ ์๋ฅผ ๋จ๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ์ ์ฅํ๋ ํ๋ก๊ทธ๋จ์ ๊ตฌํํ์์ค.function Node(element) {
this.element = element;
this.next = null;
}
function LList() {
this.head = new Node("head");
this.find = find;
this.insert = insert;
this.findPrevious = findPrevious;
this.remove = remove;
this.display = display;
this.lastElement = lastElement;
}
function find(item) {
let currNode = this.head;
while (currNode.element !== item) {
currNode = currNode.next;
}
return currNode;
}
function insert(newElement, item) {
let newNode = new Node(newElement);
let current = this.find(item);
newNode.next = current.next;
current.next = newNode;
}
function display() {
let currNode = this.head;
while (!(currNode.next === null)) {
console.log(currNode.next.element);
currNode = currNode.next;
}
}
function findPrevious(item) {
let currNode = this.head;
while (!(currNode.next === null) && currNode.next.element !== item) {
currNode = currNode.next;
}
return currNode;
}
function remove(item) {
let prevNode = this.findPrevious(item);
if (!(prevNode.next === null)) {
prevNode.next = prevNode.next.next;
}
}
function lastElement() {
let currNode = this.head;
while (!(currNode.next === null)) {
currNode = currNode.next;
}
return currNode;
}
scores = new LList();
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", function (score) {
scores.insert(score,"head")
rl.close();
});
rl.on("line", function (score) {
const lastEl = scores.lastElement()
if(lastEl === null){
scores.insert(score,"head")
}else{
scores.insert(score,lastEl)
}
rl.close();
});
5. ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํด 6-4๋ฅผ ๋ค์ ๊ตฌํํ์์ค.
6-4๋ ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ๊ตฌํ๋์ด ์๋ค.(๋ฐ๋ณต)
6. ์์ธํธ์ค์ 40๋ช
์ ์ ๋์ธ์ด ๋ก๋ง ๊ตฐ์ธ์๊ฒ ๋ถ์กํ ์๊ธฐ์ ์ฒํ๋ค. ์ ๋์ธ ๋ณ์ฌ๋ค์ ํฌ๋ก๋ก ์กํ๋๋ ์ฃฝ์์ ํํ๊ธฐ๋ก ํ๋ค. ์ฌ๋์ผ๋ก ์์ ๋ง๋ ๋ค์ ์ฌ๋์ด ๋จ์ง ์์ ๋๊น์ง ๋งค ์ธ ๋ฒ์งธ ๋ณ์ฌ๋ฅผ ์ฃฝ์ฌ ๋๊ฐ๊ธฐ๋ก ์์ ์ ์ธ์ ๋ค. ์์ธํธ์ค์ ๋ค๋ฅธ ํ ๋ช
์ ์ผ์ฐ ์ฃฝ์์ ๋นํ๋ ์์น์ ์๊ณ ์ถ์ง ์์ ์ด๋์ ์์ผ ์ตํ๊น์ง ์์กดํ ์ ์์์ง ๋นจ๋ฆฌ ๊ณ์ฐํด์ผ ํ๋ค. n ๋ช
์ ์ฌ๋์ด ์์ ๋ง๋ค๊ณ ๋งค m ๋ฒ์งธ ์ฌ๋์ ์ฃฝ์ด๋ ํ๋ก๊ทธ๋จ์ ๊ตฌํํ์์ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ๋จ์ ๋ ์ฌ๋์ ๊ณ์ฐํ์์ค. ์ํํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
n๋ช
์ ์ฌ๋๊ณผ m๋ฒ์งธ ์ฌ๋์ ์ฃฝ์ด๊ธฐ ์ํด n, m์ ์
๋ ฅ ๋ฐ๋ ๊ฒ์ ๋ฐ๋ก ๊ตฌํํ์ง ์์๊ณ ๋ฏธ๋ฆฌ ์
๋ ฅํ n๋ช
์ ์ฌ๋์ ํ๊ธ ์ด๋ฆ ์์ฑ๊ธฐ๋ก ๋ง๋ค์ด์ ์ด ์ํํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํด ๋ฏธ๋ฆฌ ์
๋ ฅํ m๋ฒ์งธ ์ฌ๋์ ๋งค๋ฒ ์ฃฝ์ด๊ณ ๋ง์ง๋ง์ผ๋ก ๋จ์ ์์กด์๋ค์ ์ถ๋ ฅํ ์ ์๋๋ก ๊ตฌํํ์๋ค.
์ด๋ฅผ ์ํด ์๋์ 3๊ฐ ๋ฉ์๋๊ฐ ํ์ํ๋ค.
- generateRandomName : ์ฑ๊ณผ ์ด๋ฆ์ Math.random()ํจ์์ Math.floor๋ฅผ ์ด์ฉํด์ ๋ง๋ค๊ณ ํฉ์ณ์ ํ ๋ช ์ ๋ณ์ฌ๋ฅผ ๋ง๋ค์๋ค.
// ํ๊ธ ์ด๋ฆ ์์ฑ๊ธฐconst generateRandomName = () => {
const lastName = "๊น์ด๋ฐ";
const firstName =
"ํผ์ด๋๋ ๋๊น์ง ๋ํ ์ฒญ์ถ์ ์ํ์ฌ์. ๋ฐ์ ๋ถ์ด ์ฒญ์ถ์ ๋ณด์ด๋ ํ๋ถํ๊ฒ ์ด๊ฒ์ด๋ค. ๋ชธ์ด ๋ฌผ๋ฐฉ์ ํ์ ๊ณต์๋ ์ธ์์ ๊ฐ์ง ํ์ด ์ด๊ฒ์ด๋ค. ์ด๋ ์ฐฝ๊ณต์ ํผ์ด๋๊ธฐ ํผ๋ค. ํ์ด ์์ ๊ณผ ํ์ฌ๋ ๊ฒ์ด๋ค. ํ๋ถํ๊ฒ ์ธ๋ํ๊ฒ ๋ค๋ ์ผ๋ง๋ ๊ทธ๋ค์ ์ฒญ์ถ์ ๊ธด์ง๋ผ ๋ฌผ๋ฐฉ์ ์ฝ๋ํ๋ค. ๋
ธ๋
์๊ฒ์ ๋ํ ํ์ฐจ๊ฒ ์๋ ๊ทธ๋ค์ ํ ์ง๋, ๋๊น์ง ์ค๋ฉฐ๋ค์ด ์ด๋ฝ์ ์ด๋ค. ๋ฐ์ด๋ฉฐ, ์ธ์์ ํฌ๊ณ ์ด์ ์ฐ์ผ์ ๊ฒ์ด๋ค. ์ด์์ด ๋ฐฉํฉํ์์ผ๋ฉฐ, ๋ด๋ฐ๋์ ๋ง์ด๋ค. ๋ฌด์์ด ์ฐฌ๋ฏธ๋ฅผ ๋ญ ์ด์์ ๋ณด๋ ๋ฐฉ์งํ๋ ์์ผ๋ฉด, ์ฒญ์ถ์ ์๊ฐ ์ํ์ฌ์. ๋ฐฅ์ ์ผ์์ ๊ฝ์ด ์ด๋ฝ์ ๋ฃ๋๋ค. ๋ณ๊ณผ ๊ทธ๋ค์ ๋งบ์ด, ์ด๋ ํ์ ์ด๊ฒ์ด์ผ๋ง๋ก ์๋ํ๊ณ , ์ค๋ฉฐ๋ค์ด ์ฒ ํํ์๋๊ฐ? ๊ทธ๋ฌ๋ฏ๋ก ๋
ธ๋ํ๋ฉฐ ํ์ ์ปค๋ค๋ ์ํ์ฌ, ๋ฐฉํฉํ์ฌ๋, ๊ฒ์ ๊ทธ๊ฒ์ ์ด๊ฒ์ด๋ค. ๊ฐ์ ํ๋ ์ญ์ฌ๋ฅผ ํผ์ด๋๊ธฐ ๋ง์ฒํ์ ํ๋ณต์ค๋ฝ๊ณ ์ค๋ฉฐ๋ค์ด ๋ฐ์ด๋ฉฐ, ์ฌ๋ง์ด๋ค. ๋์์ ๊ฑฐ์ ์ ๋ฌด์์ ์ฒญ์ถ์ ์ํ์ฌ ์๋ค์ด ๊ฑฐ์น ๊ฒ์ด๋ค. ๊ฐ์น๋ฅผ ๋๋ ฅ์ ์ ์ ์๋
์๊ฒ์ ์๋ ์ฒ๊ณ ์ ์ํ์ฌ, ๊ท๋ ๊ฒ์ด๋ค. ์ธ๋ํ๊ฒ ๋ค๋ ์ด๋ ๋ณด์ด๋ ์ฌ์ฅ์ ๋ฌด์์ ์๋ค์ด ์ผ๋ง๋ ๊ณผ์ค์ด ๋ณด๋ผ. ๊ทธ๊ฒ์ ๋ง์ด ๋ ์นด๋ก์ฐ๋ ๋๋ ์ท์ ๋ฐ์ด๋ฉฐ, ๊ฐ๋ ์์์ผ๋ก์จ ์ฝ๋ํ๋ค. ์ฒญ์ถ์ ์ด๊ฒ์ด์ผ๋ง๋ก ๊ท๋ ๋์ด ๋ฅํ ๋ฐ๋ปํ ๊ฒ์ด๋ค. ํ์๊ธฐ ๊ฐ์ด, ๋ณด์ด๋ ์์ ๊ณผ ๊ฒ์ด๋ค. ํผ๊ณ , ๋ฐฉํฉํ์์ผ๋ฉฐ, ๋ฐ์ด๋ฉฐ, ํผ๋ค. ํผ์ด๋๊ธฐ ๊ฐ์น๋ฅผ ๊ฝ ํ๋ณต์ค๋ฝ๊ณ ๊ฐ์ด, ๊ทธ๋ค์ ๋ฌด์์ ์ด์์ ์ฌ๋ง์ด๋ค.์๋ ๋๋ ๋ง๋ฌผ์ ๋ฐฅ์ ๋ด๋ฐ๋์ด๋ค. ๊ฐ์ด, ๊ฝ์ด ํ๋ถํ๊ฒ ๋์ด์ง๋ผ ๋ญ ๊ฒ์ ์ฉ๊ฐํ๊ณ ํ์ค๋ฅด๊ณ ์ํ์ฌ์. ๊ฐ๋ ์ฐ๋ฆฌ๋ ๋๊น์ง ๋ชปํ ๊ทธ๋ค์ ํ์์ผ๋ฉฐ, ์ถ์ด ๋์ฐ์๋ ๊ทธ๋ฌ๋ฏ๋ก ๋ณด๋ผ. ๋ชฉ์จ์ ์ฒํ๋ฅผ ์ฅ์ํ๋ ๊ณต์๋ ํผ๊ฐ ์ด๊ฒ์ ์ฝ๋ํ๋ค. ๋ฅํ ์ฐ๋ฆฌ๋ ๊ฒ์ ์ฌ๋๊ฐ ๊ฒ์ด๋ค. ๋ฏธ๋ฌํ ๋๋ ํํ์ค๋ฌ์ด ํ์ฌ๋ ์ด์, ํ ์ง๋ผ๋ ๊ฒ์ด๋ค. ํ๋ถํ๊ฒ ๊ตฌํ์ง ๋๋ ์ฐพ์๋ค๋
๋, ์๋ ์ฐ๋ฆฌ ๊ทธ๋ค์ ์ฒ์๋งํ์ด ์์ผ๋ด? ์ค๋ฉฐ๋ค์ด ํ๊ณ ์๋ํ๊ณ , ๋๋๋ค. ์ํ์ฌ, ๊ฐ์ง ํ์ค๋ฅด๊ณ ์ฒญ์ถ์ ํ ์ง๋ผ๋ ๋ชฉ์จ์ ๊ทธ๋ค์ ์ผ๋ง๋ ์ธ์ธํ๋ด? ๋์ด ์ฒญ์ถ์ ๋ฌด์์ ๋ด๋ฐ๋์ด๋ค.";
let name =
lastName.charAt(Math.floor(Math.random() * lastName.length)) +
firstName.substr(Math.floor(Math.random() * firstName.length), 2);
//Math.random().toString(36).substring(0, num);return name;
};
- generateSoldier(n) : n๊ฐ์ ์ฌ๋ ์๋ฅผ ๋ฐ์์ ๊ทธ๋งํผ ๋ณ์ฌ ์ด๋ฆ์ ์์ฑํ ๋ค ์ํํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์ฐ๊ฒฐํ๋ค. (๋ณ์ฌ๋ค๋ก ์์ ๋ง๋ ๋ค.)
์ฒซ ๋ฒ์งธ ๋ณ์ฌ์ ๊ฒฝ์ฐ์๋ 'head' ๋
ธ๋ ๋ค์์ ์ค์ ์ธ์์ผ ๋๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๋ถ๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์๊ณ ๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋ ์์ฑํ ๋ณ์ฌ๋ฅผ ๊ธฐ์กด ๋ณ์ฌ์ ์ ์ฅ์์ผ๋์๋ค๊ฐ ๊ธฐ์กด ๋ณ์ฌ์ ์์น๋ฅผ ์ฐพ์ ๋ฐ๋ก ๋ค์ ์๋ก์ด ๋ณ์ฌ๋ฅผ insertํ๋ ๋ฐฉ์์ผ๋ก ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด์ฃผ์๋ค.
function generateSoldier(n) {
let createdEl = "";
let createdPrevEl = "";
for (let i = 0; i < n; ++i) {
if (i === 0) {
createdEl = generateRandomName();
this.insert(createdEl, "head");
} else {
createdEl = generateRandomName();
this.insert(createdEl, createdPrevEl);// ์ ์ฅํด๋์๋ ์ด์ ๋ณ์ฌ๋ฅผ ์ด์ฉํด ์์๋ฅผ ์ถ๊ฐํจ
}
// ์ด์ ๋ณ์ฌ๋ฅผ ์ ์ฅํ๊ณ ๋ค์ ๋ฃจํ์์ ์๋ก์ด ๋ณ์ฌ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํ ๊ธฐ์กด ๋ณ์ฌ๋ก ์
createdPrevEl = createdEl;
}
}
- killSoldier(m) : ๋งค m ๋ฒ์งธ์ ๋ณ์ฌ๋ฅผ ์ฃฝ์ด๋ ๋ฉ์๋๋ก ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์ฒ์๋ถํฐ ๋๊น์ง ํ์ํ๋ display() ๋ฉ์๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ๊ตฌํํ์๋ค. ๊ทธ๋์ currNode์ ์ด๊น๊ฐ์ head๋ก ๋๊ฐ์ด ๋์๋ค.
์กฐ๊ธ ๋ค๋ฅธ ์ ์ while๋ฌธ์ ์กฐ๊ฑด๋ฌธ์ currNode.next.element === 'head'๋ฉด ํ์์ ์ข
๋ฃํ๋(๋๊น์ง ํ์ํ์ผ๋ฏ๋ก ๊ทธ๋ค์์ด 'head'์ด๊ธฐ ๋๋ฌธ์) ๊ฒ์ผ๋ก ๋์ด ์๋๋ฐ ์ด ๋๋ฌธ์ ๋ค์ ๋
ธ๋๊ฐ 'head'์ผ ๋ ๋ณ์ฌ๋ฅผ ์ฃฝ์ด๋ ํจ์๊ฐ ํธ์ถ๋๊ธฐ ์ ์ while๋ฌธ์ ๋์๋ฒ๋ฆฌ๊ฒ ๋๋ค. ๊ทธ๋์ ์ด ๊ฒฝ์ฐ if๋ฌธ์ผ๋ก ๋ฐ๋ก currNode.element๋ฅผ removeํด์ฃผ๊ณ while๋ฌธ์ ์ข
๋ฃ์ํค๋๋ก ๊ตฌํํ์๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก i๊ฐ 1์์ ํ๋์ฉ ๋์ด๊ฐ๋ฉด์ ์
๋ ฅ๋ฐ์ m๊ณผ ๊ฐ์์ง๋ ๊ฒฝ์ฐ ํด๋นํ๋ currNode(๋ณ์ฌ)๋ ์ญ์ (์ฃฝ์)๋ฅผ ๋นํด์ผ ํ๋ค. ์๋ํ๋ฉด ๋จผ์ head(๋ณ์ฌ ์๋)๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ m์ด 5(5๋ฒ์งธ๋ฅผ ์ฃฝ์)๋ผ๊ณ ํ๋ค๋ฉด i๊ฐย 0, 1,,,, 5(6๋ฒ์งธ)๋ถํฐ ์ฃฝ์ฌ์ผํ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ด๋ ๊ฒ currNode.element๋ฅผ temp์ ๋ด์ removeํด ๋๊ฐ๊ณ , currNode์๋ ๋ค์ ๋
ธ๋๋ฅผ ์ ์ฅ์ํค๋ฉด์ ๊ณ์ ์ง์๋๊ฐ๋ค.
์ด๋ ๊ฒ i๊ฐ ์ฆ๊ฐํ๋ ๊ณผ์ ์ match๊ฐ 1์ด ์๋ ๋๋ง ๋ฐ๋ณต๋๋๋ก ๊ตฌํ๋์ด ์๋๋ฐ ์ด๋ m๋ฒ์งธ ๋ณ์ฌ๋ฅผ ์ฒ์ ๋ง๋๊ฒ ๋ ๋ match = 1์ ํ ๋นํด์ฃผ์ด ๊ทธ๋๋ถํฐ๋ ๊ณ์ํด์ m๋ฒ์งธ๋ก ์ค๋ ๋ณ์ฌ๋ฅผ ์ฃฝ์ด๊ธฐ ์ํด์ match๋ผ๋ ๋ณ์๋ฅผ ๋์๋ค.
function killSoldier(m) {
let currNode = this.head;
let i = 1;
let match = -1;
while (!(currNode.next === null)) {
if (i === m) {
console.log("i=m", currNode);
console.log();
let temp = currNode.element;
currNode = currNode.next;
this.remove(temp);//this.remove(currNode.element);
match = 1;
} else {
console.log("i!=m", currNode);
console.log();
currNode = currNode.next;
if (match !== 1) {
i++;
}
}
console.log(
"while์ข
๋ฃ",
currNode.next === null,
currNode.next.element == "head"// ์ด ๊ฐ์ด true๊ฐ ๋์ด ๋ง์ง๋ง m๋ฒ์งธ ๋ณ์ฌ๊ฐ ์ฃฝ์ง ์๋ ์ํฉ์
);
if (currNode.next.element == "head") {
console.log(
"๋ค์์ด head์
๋๋ค. ๊ทธ๋ผ ๋ง์ง๋ง์ผ๋ก ์ฃฝ์ผ ๋ณ์ฌ๋",
currNode.element
);
this.remove(currNode.element);
return;
}
}
}
์๋ฅผ ํ
์คํธํ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
let soldiers = new LList();
soldiers.generateSoldier(10);// n๋ช
์ ๋ณ์ฌ๋ฅผ ๋ง๋ฆ
soldiers.display();
console.log();
soldiers.killSoldier(5);// m๋ช
์ ๋ณ์ฌ๋ฅผ ์ฃฝ์console.log("์์กด์๋ : ");
soldiers.display();
ํ
์คํธ ๊ฒฐ๊ณผ