From 753ef0ec1d430729d6402088e5ca9a1558a42e7e Mon Sep 17 00:00:00 2001 From: umbrellamoss Date: Sat, 20 Jul 2024 11:06:23 +0900 Subject: [PATCH 1/9] Feat. problem-1-1 --- problem-1-1/problem-1-1.test.js | 41 +++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/problem-1-1/problem-1-1.test.js b/problem-1-1/problem-1-1.test.js index 6ab9348..2cc3ab6 100644 --- a/problem-1-1/problem-1-1.test.js +++ b/problem-1-1/problem-1-1.test.js @@ -1,6 +1,47 @@ + +//1. 백의 정의에 따라서 API를 설계해 주세요. +// | 함수 시그니처 | 설명 | +// | ----------- | ----------- | ----------- | ----------- | ----------- | +// | isEmpty(): boolean | 배열 빈값 여부에 따라 값을 boolean형태로 반환합니다 | +// | add(string): void | 아이템을 받아 배열에 추가합니다. | +// | size(): number | 배열의 길이를 반환합니다. | +// | ----------- | ----------- | ----------- | ----------- | ----------- | + + +//3. 클라이언트 코드가 올바르게 동작하도록 백 자료구조를 만들어 주세요. class Bag { + constructor(){ + this.bag = []; + } + + isEmpty(){ + return this.bag.length === 0; + } + + add(item){ + this.bag.push(item); + } + + size(){ + return this.bag.length; + } + + [Symbol.iterator](){ + let index = 0; + const bag = [...this.bag]; + + return { + next(){ + return index < bag.length ? { done : false, value : bag[index++]} : { done : true}; + } + } + } + + } + + test('백은 비어있는 상태로 생성된다', () => { const bag = new Bag(); From cf272faa131ba0dde5974b5e57cf8cbb45707cb6 Mon Sep 17 00:00:00 2001 From: umbrellamoss Date: Sat, 20 Jul 2024 11:06:48 +0900 Subject: [PATCH 2/9] Feat. problem-1-2 --- problem-1-2/problem-1-2.test.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/problem-1-2/problem-1-2.test.js b/problem-1-2/problem-1-2.test.js index f2956b6..8536c91 100644 --- a/problem-1-2/problem-1-2.test.js +++ b/problem-1-2/problem-1-2.test.js @@ -1,4 +1,11 @@ -const solution = (numbers) => { +const solution = (numbers = []) => { + if(numbers.length === 0) return 0; + + const total = numbers.reduce((acc, curr) => acc + curr, 0), + average = total / numbers.length; + + return Math.floor(average); + }; test('숫자 배열의 평균을 반환한다', () => { From 0b1a3cf5f6ccc12b5e66a84f3816460f31743a27 Mon Sep 17 00:00:00 2001 From: umbrellamoss Date: Sat, 20 Jul 2024 11:21:54 +0900 Subject: [PATCH 3/9] Feat. problem-2-1 --- problem-2-1/problem-2-1.test.js | 43 +++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/problem-2-1/problem-2-1.test.js b/problem-2-1/problem-2-1.test.js index 17412df..4af8e5f 100644 --- a/problem-2-1/problem-2-1.test.js +++ b/problem-2-1/problem-2-1.test.js @@ -1,4 +1,47 @@ +// 1. 스택의 정의에 따라서 API를 설계해 주세요. + +// | 함수 시그니처 | 설명 | +// | ----------- | ----------- | ----------- | ----------- | +// | isEmpty(): boolean | stack 배열의 빈값 여부에 따라 boolean 타입을 반환합니다. | +// | push(item): void | stack 배열에 아이템을 추가합니다. | +// | size(): number | stack 배열의 길이를 반환합니다. | +// | pop(): string | Error | stack 배열에 가장 최근에 삽입한 값을 반환합니다. | + class Stack { + constructor(){ + this.stack = []; + } + + isEmpty(){ + return this.stack.length === 0; + } + + push(item){ + this.stack.push(item); + } + + size(){ + return this.stack.length; + } + + pop(){ + if(this.isEmpty()) throw new Error('스택이 비어있습니다'); + + return this.stack.pop(); + } + + [Symbol.iterator](){ + let index = 0, + stack = [...this.stack]; + stack = stack.reverse(); + + return { + next(){ + return index < stack.length ? {done : false, value : stack[index++]} : {done : true} + } + } + + } } test('스택을 생성하면 비어있다', () => { From 62688bef03777aa5cccd9b4ebcfb6744032fce92 Mon Sep 17 00:00:00 2001 From: umbrellamoss Date: Sat, 20 Jul 2024 11:50:50 +0900 Subject: [PATCH 4/9] Feat. problem-2-2 --- problem-2-2/problem-2-2.test.js | 54 +++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/problem-2-2/problem-2-2.test.js b/problem-2-2/problem-2-2.test.js index dab5212..f522b46 100644 --- a/problem-2-2/problem-2-2.test.js +++ b/problem-2-2/problem-2-2.test.js @@ -1,4 +1,58 @@ +class Stack { + constructor(){ + this.stack = []; + } + + isEmpty(){ + return this.stack.length === 0; + } + + push(item){ + this.stack.push(item); + } + + size(){ + return this.stack.length; + } + + pop(){ + if(this.isEmpty()) throw new Error('스택이 비어있습니다'); + + return this.stack.pop(); + } + + [Symbol.iterator](){ + let index = 0, + stack = [...this.stack]; + stack = stack.reverse(); + + return { + next(){ + return index < stack.length ? {done : false, value : stack[index++]} : {done : true} + } + } + + } +} + const solution = (string) => { + const stack = new Stack(); + const brackets = { '[': ']', '{': '}', '(': ')' }; + + for (const bracket of string) { + if(brackets[bracket]){ + stack.push(bracket); + }else{ + + if(stack.isEmpty()) return false; + + const savedBrackets = stack.pop(); + if(brackets[savedBrackets] !== bracket) return false; + } + } + + return true; + }; test('문자열에 포함된 괄호의 짝이 맞을 때 true를 반환한다', () => { From 7f76aa3965ebfb1b3b31322085df31bebc093b3f Mon Sep 17 00:00:00 2001 From: umbrellamoss Date: Sat, 20 Jul 2024 12:10:30 +0900 Subject: [PATCH 5/9] Feat. problem-3-1 --- problem-3-1/problem-3-1.test.js | 46 +++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/problem-3-1/problem-3-1.test.js b/problem-3-1/problem-3-1.test.js index 6ae251f..cd61d8b 100644 --- a/problem-3-1/problem-3-1.test.js +++ b/problem-3-1/problem-3-1.test.js @@ -1,4 +1,50 @@ +// 1. 큐의 정의에 따라서 API를 설계해 주세요. +// | 함수 시그니처 | 설명 | +// | ----------- | ----------- | +// | isEmpty(): boolean | items 배열의 빈값 여부에 따라 boolean타입을 반환합니다.| +// | size(): number | items의 배열의 길이를 반환합니다. | +// | enqueue(item): void | items배열에 item을 추가합니다.| +// | dequeue(): string | items배열에 가장 먼저 추가 된 item을 제거하고 제거된 item을 반환합니다.| + + class Queue { + constructor(){ + this.items = []; + } + + isEmpty(){ + return this.items.length === 0; + } + + size(){ + return this.items.length; + } + + enqueue(item){ + this.items.push(item); + } + + dequeue(){ + if(this.size() === 0) throw new Error('큐가 비어있습니다'); + + const item = this.items.shift(); + return item; + } + + [Symbol.iterator](){ + let index = 0; + const queue = [...this.items]; + + return { + next() { + return index < queue.length + ? { done: false, value: queue[index++] } + : { done: true }; + }, + }; + } + + } test('큐를 생성하면 비어있다', () => { From 7ceecf1ebbd314f747ff2bc14a89c57bc4d6ca91 Mon Sep 17 00:00:00 2001 From: umbrellamoss Date: Sat, 20 Jul 2024 12:52:29 +0900 Subject: [PATCH 6/9] Feat. problem-3-2 --- problem-3-2/problem-3-2.test.js | 58 +++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/problem-3-2/problem-3-2.test.js b/problem-3-2/problem-3-2.test.js index 21bd836..c1e2042 100644 --- a/problem-3-2/problem-3-2.test.js +++ b/problem-3-2/problem-3-2.test.js @@ -1,4 +1,62 @@ +class Queue { + constructor(){ + this.items = []; + } + + isEmpty(){ + return this.items.length === 0; + } + + size(){ + return this.items.length; + } + + enqueue(item){ + this.items.push(item); + } + + dequeue(){ + if(this.size() === 0) throw new Error('큐가 비어있습니다'); + + const item = this.items.shift(); + return item; + } + + setNumbers(number){ + for(let i = 1; i <= number; i++){ + this.enqueue(i); + } + } + + [Symbol.iterator](){ + let index = 0; + const queue = [...this.items]; + + return { + next() { + return index < queue.length + ? { done: false, value: queue[index++] } + : { done: true }; + }, + }; + } + + +} + const solution = (N, M) => { + const queue = new Queue(); + queue.setNumbers(N); + + while (queue.size() > 1) { + for (let index = 0; index < M - 1; index += 1) { + const dequeuedNumber = queue.dequeue(); + queue.enqueue(dequeuedNumber); + } + queue.dequeue(); + } + + return queue.dequeue(); }; test('N명의 사람이 있을 때 M번째 사람을 없앨 때 마지막에 죽는 사람의 순서를 반환한다', () => { From 3770590bfc09df05a3792001f87ce0f31a19aac2 Mon Sep 17 00:00:00 2001 From: umbrellamoss Date: Mon, 22 Jul 2024 21:47:04 +0900 Subject: [PATCH 7/9] =?UTF-8?q?Fix.=20problem-2-1=20=EA=B3=BC=EC=A0=9C=20?= =?UTF-8?q?=ED=92=80=EC=9D=B4=20=EB=B3=B4=EB=A9=B4=EC=84=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problem-2-1/problem-2-1.test.js | 43 +++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/problem-2-1/problem-2-1.test.js b/problem-2-1/problem-2-1.test.js index 4af8e5f..f9b654b 100644 --- a/problem-2-1/problem-2-1.test.js +++ b/problem-2-1/problem-2-1.test.js @@ -2,42 +2,65 @@ // | 함수 시그니처 | 설명 | // | ----------- | ----------- | ----------- | ----------- | +// | Stack(): 스택을 생성합니다. | // | isEmpty(): boolean | stack 배열의 빈값 여부에 따라 boolean 타입을 반환합니다. | // | push(item): void | stack 배열에 아이템을 추가합니다. | // | size(): number | stack 배열의 길이를 반환합니다. | // | pop(): string | Error | stack 배열에 가장 최근에 삽입한 값을 반환합니다. | +class Node { + #item; + #next; +} class Stack { + #first; + #n; + constructor(){ - this.stack = []; + this.#n = 0; } isEmpty(){ - return this.stack.length === 0; + return this.#first === undefined; } + + //resize를 왜 private함수로 했는지 궁금합니다 push(item){ - this.stack.push(item); + const oldFirst = this.#first; + + this.#first = new Node(); + this.#first.item = item; + this.#first.next = oldFirst; + + this.#n++; } size(){ - return this.stack.length; + return this.#n; } pop(){ - if(this.isEmpty()) throw new Error('스택이 비어있습니다'); + if(this.#first === undefined) throw new Error('스택이 비어있습니다'); + + const item = this.#first.item; + this.#n--; - return this.stack.pop(); + this.#first = this.#first.next; + + return item; } [Symbol.iterator](){ - let index = 0, - stack = [...this.stack]; - stack = stack.reverse(); + let current = this.#first; return { next(){ - return index < stack.length ? {done : false, value : stack[index++]} : {done : true} + if(current === undefined) return {done : true}; + const value = current.item; + current = current.next; + + return { done : false, value} } } From 4362ba8293e18a762c0484703953ee5355d4a20b Mon Sep 17 00:00:00 2001 From: umbrellamoss Date: Mon, 22 Jul 2024 22:09:08 +0900 Subject: [PATCH 8/9] =?UTF-8?q?Fix.=20problem-3-1=20=EA=B3=BC=EC=A0=9C=20?= =?UTF-8?q?=ED=92=80=EC=9D=B4=20=EB=B3=B4=EB=A9=B4=EC=84=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problem-3-1/problem-3-1.test.js | 58 +++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/problem-3-1/problem-3-1.test.js b/problem-3-1/problem-3-1.test.js index cd61d8b..d6800be 100644 --- a/problem-3-1/problem-3-1.test.js +++ b/problem-3-1/problem-3-1.test.js @@ -1,47 +1,77 @@ // 1. 큐의 정의에 따라서 API를 설계해 주세요. // | 함수 시그니처 | 설명 | // | ----------- | ----------- | +// | Queue() | 큐를 생성합니다.| // | isEmpty(): boolean | items 배열의 빈값 여부에 따라 boolean타입을 반환합니다.| // | size(): number | items의 배열의 길이를 반환합니다. | // | enqueue(item): void | items배열에 item을 추가합니다.| // | dequeue(): string | items배열에 가장 먼저 추가 된 item을 제거하고 제거된 item을 반환합니다.| +class Node{ + #item; + #next; +} class Queue { + #n; + #first; + #last; + constructor(){ - this.items = []; + this.#n = 0; } isEmpty(){ - return this.items.length === 0; + return this.#first === undefined; } size(){ - return this.items.length; + return this.#n; } enqueue(item){ - this.items.push(item); + const oldLast = this.#last; + this.#last = new Node(); + this.#last.item = item; + + if(this.isEmpty()){ + this.#first = this.#last; + } else { + oldLast.next = this.#last; + } + + this.#n++; } dequeue(){ - if(this.size() === 0) throw new Error('큐가 비어있습니다'); + if(this.isEmpty()) throw new Error('큐가 비어있습니다'); + + const item = this.#first.item; + this.#first = this.#first.next; + + if(this.isEmpty()){ + this.#last = undefined; + } + + this.#n--; - const item = this.items.shift(); return item; } [Symbol.iterator](){ - let index = 0; - const queue = [...this.items]; + let current = this.#first; return { - next() { - return index < queue.length - ? { done: false, value: queue[index++] } - : { done: true }; - }, - }; + next(){ + if(current === undefined) return { done : true }; + + const value = current.item; + current = current.next; + + return { done : false, value}; + } + } + } From c3a96b93fac17e63cb56818d7eacecfdef928522 Mon Sep 17 00:00:00 2001 From: umbrellamoss Date: Fri, 26 Jul 2024 22:09:35 +0900 Subject: [PATCH 9/9] =?UTF-8?q?Fix.=20problem-2-2=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problem-2-2/problem-2-2.test.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/problem-2-2/problem-2-2.test.js b/problem-2-2/problem-2-2.test.js index f522b46..df31cf1 100644 --- a/problem-2-2/problem-2-2.test.js +++ b/problem-2-2/problem-2-2.test.js @@ -35,7 +35,9 @@ class Stack { } } -const solution = (string) => { +const solution = (string = '') => { + if(string.length % 2 === 1 || string.length === 0) return false; + const stack = new Stack(); const brackets = { '[': ']', '{': '}', '(': ')' }; @@ -46,8 +48,9 @@ const solution = (string) => { if(stack.isEmpty()) return false; - const savedBrackets = stack.pop(); - if(brackets[savedBrackets] !== bracket) return false; + const savedBracket = stack.pop(); + + if(brackets[savedBracket] !== bracket) return false; } } @@ -55,6 +58,10 @@ const solution = (string) => { }; +test('문자열에 포함된 괄호의 짝이 맞지 않을 때 false를 반환한다', () => { + expect(solution('()(')).toBe(false); +}); + test('문자열에 포함된 괄호의 짝이 맞을 때 true를 반환한다', () => { expect(solution('{([])}')).toBe(true); });