From 6fc80247d84929f1c818f76233021485fbecfdba Mon Sep 17 00:00:00 2001 From: JK <74600256+Programmer-JK@users.noreply.github.com> Date: Thu, 22 Aug 2024 18:34:07 +0900 Subject: [PATCH 1/3] =?UTF-8?q?coding=20test=201=EC=A3=BC=EC=B0=A8=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\353\241\234\355\203\210\354\266\234.md" | 83 ++++++++ ... \353\215\224 \353\247\265\352\262\214.md" | 68 +++++++ ...0 \352\267\270\353\236\230\355\224\204.md" | 62 ++++++ ...14\353\224\224\355\216\234\354\212\244.md" | 177 ++++++++++++++++++ ...35\353\260\260\354\203\201\354\236\220.md" | 27 +++ 5 files changed, 417 insertions(+) create mode 100644 "1\354\243\274\354\260\250/Level 2 \353\257\270\353\241\234\355\203\210\354\266\234.md" create mode 100644 "1\354\243\274\354\260\250/Level2 \353\215\224 \353\247\265\352\262\214.md" create mode 100644 "1\354\243\274\354\260\250/Level2 \353\217\204\353\204\233\352\263\274 \353\247\211\353\214\200 \352\267\270\353\236\230\355\224\204.md" create mode 100644 "1\354\243\274\354\260\250/Level2 \355\203\200\354\233\214\353\224\224\355\216\234\354\212\244.md" create mode 100644 "1\354\243\274\354\260\250/Level2 \355\203\235\353\260\260\354\203\201\354\236\220.md" diff --git "a/1\354\243\274\354\260\250/Level 2 \353\257\270\353\241\234\355\203\210\354\266\234.md" "b/1\354\243\274\354\260\250/Level 2 \353\257\270\353\241\234\355\203\210\354\266\234.md" new file mode 100644 index 0000000..39fab5c --- /dev/null +++ "b/1\354\243\274\354\260\250/Level 2 \353\257\270\353\241\234\355\203\210\354\266\234.md" @@ -0,0 +1,83 @@ +#### 1. 문제 파악 +- 문제의 요점 : 너비우선탐색 BFS방식을 통해 최단거리를 구하는 방식 + +#### 2. 내 풀이 +``` javascript +function findDistance(maps, start, target) { + var moveCount = 0; + let moveX = [1,-1,0,0]; + let moveY = [0,0,1,-1]; + + var goX = 0; + var goY = 0; + + maps[start[0]][start[1]] = 'X' + + var queue = [start]; + + while (queue.length > 0) { + var size = queue.length; + for(var i=0; i=0 && goX=0 && goY item.split('')); + let mapsExit = maps.map(item => item.split('')); + findLever = findDistance(mapsLever, start, 'L'); + findExit = findDistance(mapsExit, lever, 'E'); + + if (findLever !== -1 && findExit !== -1) { + answer = findLever + findExit; + } else { + answer = -1; + } + + return answer; +} +``` +##### 풀이 방식 +- 우선적으로 start포인트, lever포인트를 찾아야 한다고 생각했다. +- 그렇게 잡은 start포인트와 lever포인트를 사용하여, start -> lever , lever -> end까지의 두번의 최단거리를 찾아, 찾은 두개의 최단거리를 더해 최종값을 반환하는 구조로 설계했다. +- javascript에서 함수로 인자값을 보낼 경우, 파라미터의 값이 변경되는 문제가 발견해, mapsLever, mapsExit 두개의 map을 구성하여 진행하였다. +- 최단거리를 구하는 알고리즘으로 BFS를 사용하였으며, queue의 값이 모두 없어질 때까지 무한루프를 돌면서, 만약 target이 발견되어 횟수를 return 하여 탈출하거나 모두 없어졌음에도 target을 발견하지 못한 경우에는 탈출 불가능으로 간주하여 -1을 반환하는 로직으로 설계했다. + +##### 느낀 점 +코딩테스트 lv2를 이번에 본격적으로 처음 접해봤는데, 확실히 자료구조의 구현 방법에 대해 공부 및 연구할 필요성을 느꼈다. 특히 이번 문제는 BFS를 사용하지 않으면 타임아웃으로 실패를 뜬 것을 확인하여, 이를 해결하고자 javascript로 BFS를 공부 및 구현하는 데에 집중을 하여 해결하였다. 이를 통해 자료구조 공부의 필요성을 느꼈고, 이를 활용하면 협업에서 성능 개선에 큰 도움을 줄 것으로 생각이 되었다. \ No newline at end of file diff --git "a/1\354\243\274\354\260\250/Level2 \353\215\224 \353\247\265\352\262\214.md" "b/1\354\243\274\354\260\250/Level2 \353\215\224 \353\247\265\352\262\214.md" new file mode 100644 index 0000000..adb5a1b --- /dev/null +++ "b/1\354\243\274\354\260\250/Level2 \353\215\224 \353\247\265\352\262\214.md" @@ -0,0 +1,68 @@ +##### 1. 문제 파악 +- 문제의 요점 : 기준치 보다 낮은 음식들을 조합해 기준치 이상의 음식들을 만들어 내는 문제 + +##### 2. 내 풀이 +``` javascript +class PriorityQueue { + constructor() { + this.heap = []; + } + + enqueue(value) { + this.heap.push(value); + let index = this.heap.length - 1; + while (index > 0) { + const parentIndex = Math.floor((index - 1) / 2); + if (this.heap[parentIndex] <= this.heap[index]) break; + [this.heap[parentIndex], this.heap[index]] = [this.heap[index], this.heap[parentIndex]]; + index = parentIndex; + } + } + + dequeue() { + if (this.heap.length === 1) return this.heap.pop(); + + const min = this.heap[0]; + this.heap[0] = this.heap.pop(); + let index = 0; + while (true) { + let smallest = index; + const left = 2 * index + 1; + const right = 2 * index + 2; + + if (left < this.heap.length && this.heap[left] < this.heap[smallest]) { + smallest = left; + } + if (right < this.heap.length && this.heap[right] < this.heap[smallest]) { + smallest = right; + } + if (smallest === index) break; + + [this.heap[index], this.heap[smallest]] = [this.heap[smallest], this.heap[index]]; + index = smallest; + } + return min; + } +} + +function solution(scoville, K) { + var answer = 0; + var newScoville = new PriorityQueue(); + scoville.forEach(element => newScoville.enqueue(element)); + while(newScoville.heap[0] < K && newScoville.heap.length > 1){ + answer++; + newScoville.enqueue(newScoville.dequeue() + newScoville.dequeue()*2); + } + if(newScoville.heap[0] < K) { + return -1; + } + return answer; +} +``` + +##### 풀이 과정 +- minHeap을 사용한 우선순위큐를 활용해 낮은 음식들을 골라 계산식을 추가해 다시 우선순위큐에 넣는 로직으로 풀었다. +- heap의 최상단 0번째 노드에 음식들의 스코빌이 가장 낮은 음식이 있기 때문에, 먼저 꺼내고 두번째 꺼낸 음식을 토대로 수식을 사용해 조합해 다시 추가하는 로직을 사용했다. + +##### 느낀 점 +만약 이전 문제에서 minHeap을 사용한 우선순위큐를 구현하지 않았다면 시간적으로 꽤 걸렸을 문제라고 생각한다. 계산식은 이미 문제에서 정의내렸기 때문에, 결국엔 문제풀이의 요점은 minHeap을 사용한 우선순위큐를 구현할 수 있는지 없는지인 것으로 생각한다. \ No newline at end of file diff --git "a/1\354\243\274\354\260\250/Level2 \353\217\204\353\204\233\352\263\274 \353\247\211\353\214\200 \352\267\270\353\236\230\355\224\204.md" "b/1\354\243\274\354\260\250/Level2 \353\217\204\353\204\233\352\263\274 \353\247\211\353\214\200 \352\267\270\353\236\230\355\224\204.md" new file mode 100644 index 0000000..d591b5e --- /dev/null +++ "b/1\354\243\274\354\260\250/Level2 \353\217\204\353\204\233\352\263\274 \353\247\211\353\214\200 \352\267\270\353\236\230\355\224\204.md" @@ -0,0 +1,62 @@ +##### 1. 문제 파악 +- 문제의 요점 : edges를 활용해 그래프를 확인하여 정점과 도넛, 막대, 8자의 갯수를 찾는 문제 + +##### 2. 내 풀이 + +``` javascript +function solution(edges) { + const answer = new Array(4).fill(0); + + // 정점 : input이 없고 output만 있는 점 -> input = 0, outout > 1 + // 도넛 : input/output이 동일한 점, 1개인 경우 -> 그 외 나머지 + // 막대 : input이 있고 끝에 output이 없는 경우 -> output = 0 + // 8자 : input/output이 동일한 점, 2개인 경우 -> input = 2, output = 2 + + // 각 점마다의 input, output을 분석해야 함 + // key의 첫번째 요소는 input, 두번째 요소는 output, + // key의 1번째 요소를 map의 키 값으로 정의 + + const edgesMap = edges.reduce((map, key) => { + if (!map.has(key[0])) { + map.set(key[0], [0, 1]); + } else { + const [input, output] = map.get(key[0]); + map.set(key[0], [input, output+1]); + } + + if(!map.has(key[1])){ + map.set(key[1], [1, 0]); + } else { + const [input, output] = map.get(key[1]); + map.set(key[1], [input+1, output]); + } + return map; + }, new Map()); + + for(const [key, info] of edgesMap){ + const [input, output] = info; + if(input == 0 && output > 1){ + answer[0] = key + } else if (output == 0){ + answer[2]++; + } else if (input >= 2 && output >= 2){ + answer[3]++; + } + } + + answer[1] = edgesMap.get(answer[0])[1] - (answer[2] + answer[3]); + + return answer; +} +``` +##### 풀이 과정 +- 문제를 처음 봤을 때, 문제가 원하는 답과 그 답에 대한 조건이 뭔지 파악하는 게 우선이었다. 그림이랑 주어진 예시를 통해 내가 내린 조건은 아래와 같다. + - 정점 : input이 없고 output만 있는 점 -> input = 0, outout > 1 + - 도넛 : input/output이 동일한 점, 1개인 경우 -> 그 외 나머지 + - 막대 : input이 있고 끝에 output이 없는 경우 -> output = 0 + - 8자 : input/output이 동일한 점, 2개인 경우 -> input = 2, output = 2 +- map과 reduce을 사용하여 edges를 각 키와 input,output을 구별하여 계산하였고, 이를 토대로 조건에 맞는 갯수를 찾아냈다. +- 그러나 정답을 수정하는 과정에서 8자는 input/output이 2개가 아니라 2개 이상임을 발견하였고 이를 토대로 수정작업을 진행하여 에러를 해결해나갔다. + +##### 느낀 점 +javascript에서 reduce와 map을 사용한 경험이 부족해 이를 활용해서 코드를 짜는 데에 어려움이 있었다. 그리고 또한 그래프의 정의 및 도넛 갯수를 구하는 데 이해가 잘 안되어 어려움이 있었다. 그래서 이 문제는 푼 것만으로 끝이 아니라 좀 더 그래프에 대해 연구하고 javascript array 주요 기능들에 대해 연구 및 학습을 진행할 필요성을 느꼈다. \ No newline at end of file diff --git "a/1\354\243\274\354\260\250/Level2 \355\203\200\354\233\214\353\224\224\355\216\234\354\212\244.md" "b/1\354\243\274\354\260\250/Level2 \355\203\200\354\233\214\353\224\224\355\216\234\354\212\244.md" new file mode 100644 index 0000000..0079d3f --- /dev/null +++ "b/1\354\243\274\354\260\250/Level2 \355\203\200\354\233\214\353\224\224\355\216\234\354\212\244.md" @@ -0,0 +1,177 @@ +#### 1. 문제 파악 +- 무적권을 사용하여 유저가 주어진 유닛 수로 최대로 갈 수 있는 라운드의 수를 구하는 문제 +#### 2. 내 풀이 및 풀이방법 +``` javascript +function findMax(arr){ + var maxIndex = 0; + for(var i=0;i0) { + var maxIndex = findMax(faceEnemy); + enemySum -= faceEnemy[maxIndex]; + faceEnemy[maxIndex] = 0; + k=k-1; + } else { + return faceEnemy.length-1; + } + } + } + + return enemy.length; +} + +``` +처음 로직을 짤 때는 +1. enemy 하나씩 더해서 n보다 커질 때를 체크 +2. n보다 커질 때, 무적권(k)를 사용해 가장 큰 값을 0으로 변경 +3. 가장 큰 값을 제거한 후 그 이후 enemy를 값을 추가해가며 체크 -> 이 과정을 루프로 돎 +4. n보다 클 때, 무적권(k)가 없을 때 버틴 라운드 수를 체크 + - 일단 enemy의 값을 더한 값을 저장하는 enemySum이라는 변수 필요 + - 해치운 enemy 배열의 값을 저장하는 clearEnemy 배열 값 필요 + - 해치운 enemy 배열의 최댓값 구하는 건 Math.max함수 사용 -> 런타임 에러가 뜨는 경우가 발생해 함수를 직접 구현 +5. 게임 종료는 enemy의 합이 n보다 커졌을 때 k가 0인 경우로 생각 + +위 방식대로 시도하였으나, 시간 초과로 인한 2번의 테스트가 실패로 뜸 +그래서 확인해보니, 우선순위 큐 또는 이분탐색을 사용해 푸는 문제란 걸 깨닫고 +우선순위 큐를 통해 문제를 해결해보는 걸로 진행 + +``` javascript +class PriorityQueue { + constructor() { + this.queue = []; + } + + enqueue(element) { + for(let i=0; i n){ + if (k>0){ + arr.dequeue(); + k = k-1; + } else { + return i+1; + } + } else { + arr.enqueue(enemy[i]); + } + capacity+=popNum; + } + + return enemy.length; +} +``` +<풀이법> +``` javascript +class PriorityQueue { + constructor() { + this.heap = []; + } + + enqueue(value) { + this.heap.push(value); + let index = this.heap.length - 1; + while (index > 0) { + const parentIndex = Math.floor((index - 1) / 2); + if (this.heap[parentIndex] <= this.heap[index]) break; + [this.heap[parentIndex], this.heap[index]] = [this.heap[index], this.heap[parentIndex]]; + index = parentIndex; + } + } + + dequeue() { + if (this.heap.length === 1) return this.heap.pop(); + + const min = this.heap[0]; + this.heap[0] = this.heap.pop(); + let index = 0; + while (true) { + let smallest = index; + const left = 2 * index + 1; + const right = 2 * index + 2; + + if (left < this.heap.length && this.heap[left] < this.heap[smallest]) { + smallest = left; + } + if (right < this.heap.length && this.heap[right] < this.heap[smallest]) { + smallest = right; + } + if (smallest === index) break; + + [this.heap[index], this.heap[smallest]] = [this.heap[smallest], this.heap[index]]; + index = smallest; + } + return min; + } +} + +function solution(n, k, enemy) { + let queue = new PriorityQueue(); + enemy.slice(0, k).forEach(v => queue.enqueue(v)); + var capacity = 0; + for(let i=k;i n){ + return i; + } else { + capacity = capacity+min + } + } + + return enemy.length; +} +``` + +- 최솟값 heap을 사용해 우선순위 큐를 구현하는 방식을 연구하여 작성하여 문제를 진행했다. 가장 중요한 enqueue와 dequeue를 구현을 하여 k(무적권)만큼 queue에 push한 후, 이후 라운드 진행될 때, 우선적으로 enemy의 수를 queue에 넣은 후, queue의 가장 최솟값을 꺼내 enemy의 수에 더한 값이 n(병사수)보다 작을 때 계속 더해가며, 만약 n보다 커질 때 최종 라운드의 수를 반환하는 방식으로 진행하였다. + +##### 느낀 점 +우선순위 큐를 javascript에서 직접 구현해본 적이 처음이라 구현함에 있어서 어려웠었다. 처음에 문제만 봤을 때, 그냥 최댓값만 0으로 치환하면 되지 않을까? 라는 생각으로 진행했다가 32번의 테스트 중 단 2개의 테스트만 시간 초과로 나와 실패처리 되었을 때의 충격은 가히 말할 수 없었다... 그래서 좀 더 오래 고민하고 우선순위 큐를 최적으로 구현할 수 있는 방법 그리고 그 방법을 내가 이해할 수 있게 바꾸는 방법에 대해 오래 고민했던 것 같다. + +이분탐색으로 한 코드도 괜찮음 \ No newline at end of file diff --git "a/1\354\243\274\354\260\250/Level2 \355\203\235\353\260\260\354\203\201\354\236\220.md" "b/1\354\243\274\354\260\250/Level2 \355\203\235\353\260\260\354\203\201\354\236\220.md" new file mode 100644 index 0000000..35b72b8 --- /dev/null +++ "b/1\354\243\274\354\260\250/Level2 \355\203\235\353\260\260\354\203\201\354\236\220.md" @@ -0,0 +1,27 @@ +#### 1. 문제 파악 +- 문제의 요점 : 순차적으로 나열된 택배를 우선순위에 따라 옮길 수 있는 택배 수를 구하는 문제 + +#### 2. 내 풀이 + +``` javascript +function solution(order) { + let result = 0; + const stack = []; + + for (let i = 1; i <= order.length; i++) { + stack.push(i); + + while (stack.length !== 0 && stack.at(-1) === order[result]) { + stack.pop(); + result++; + } + } + + return result; +``` + +##### 풀이 방법 +- 메인 트레일에 놓여진 박스는 FIFO방식이며, 서브트레일은 FILO방식의 stack방식이다. 그래서 먼저 order의 길이만큼 stack(서브트레일)에 main trail의 박스를 집어넣되, 하나씩 집어넣을 때 stack의 마지막 요소가 order의 현재 인덱스의 값이 일치하는지 체크하는 루프문을 추가했다. 만약 stack의 마지막 요소가 order의 현재 인덱스의 값이 일치했을 때, order의 인덱스는 올라가고 stack의 마지막 요소는 빠진 후 그 다음 요소를 체크해 계속 확인하는 방식으로 진행했다. + +##### 느낀 점 +솔직히 말해 이 문제는 약간 운빨로 풀긴 했다. stack을 사용해야 함은 알고 있었지만, 이를 활용해 문제를 풀기 위해 console.log로 stack을 확인해가며 하나씩 시도해서 풀었다. 만약 비슷한 문제를 푼 경험이 없다면 시간이 꽤 걸렸을 거라고 생각한다. 확실히 코딩테스트는 많이 풀어봐야함을 느꼈다. \ No newline at end of file From 973f7697bbef46ca57a068d23bceefb9a1f6b653 Mon Sep 17 00:00:00 2001 From: JK <74600256+Programmer-JK@users.noreply.github.com> Date: Thu, 29 Aug 2024 10:30:57 +0900 Subject: [PATCH 2/3] 2week update --- "2\354\243\274\354\260\250/1.md" | 70 ++++++++++++++++++++++++++++++++ "2\354\243\274\354\260\250/2.md" | 28 +++++++++++++ "2\354\243\274\354\260\250/3.md" | 20 +++++++++ "2\354\243\274\354\260\250/4.md" | 70 ++++++++++++++++++++++++++++++++ "2\354\243\274\354\260\250/5.md" | 42 +++++++++++++++++++ 5 files changed, 230 insertions(+) create mode 100644 "2\354\243\274\354\260\250/1.md" create mode 100644 "2\354\243\274\354\260\250/2.md" create mode 100644 "2\354\243\274\354\260\250/3.md" create mode 100644 "2\354\243\274\354\260\250/4.md" create mode 100644 "2\354\243\274\354\260\250/5.md" diff --git "a/2\354\243\274\354\260\250/1.md" "b/2\354\243\274\354\260\250/1.md" new file mode 100644 index 0000000..ce8e1b9 --- /dev/null +++ "b/2\354\243\274\354\260\250/1.md" @@ -0,0 +1,70 @@ +#### 1. 문제 파악 +- 문제의 요점 : k만큼 숫자를 빼서 최대의 숫자를 구하는 문제 +#### 2. 내 풀이 및 풀이방법 +``` javascript +function solution(number, k) { + var answer = ''; + var arr = number.split(''); + // console.log(arr) + var index = 0; + //0~k번째 중 최고로 높은 숫자가 앞으로 나와야 함 + while(k > 0) { + var max = arr[index]; + var maxIndex = index; + var count = 0; + // console.log('maxIdx :',maxIndex) + for(var i=index+1;i 0){ + k=k-count; + arr.splice(index,count) + } + index++; + // console.log(k, count, arr) + } + + answer = arr.join('') + // console.log(arr.join('')) + return answer; +} +``` +- 처음에 문제를 풀 당시, k가 0이 될 때까지 루프를 돌면서 index를 변경 +- ![[Pasted image 20240829101327.png]] +- 이런식으로 k길이만큼 최댓값을 구한 후 최솟값을 제거하는 방식으로 풀었으나, number의 길이가 커질수록 시간복잡도가 기하급수적으로 커지며, 로직이 복잡해져, 새로운 방식을 찾아야만 했음. +- 그래서 자료구조를 찾아보던 중 stack을 사용해 푸는 방법을 찾음 +``` javascript +function solution(number, k) { + var answer = ''; + var arr = []; + + for(var i=0; i 0 && arr[arr.length-1] < number[i] && k>0){ + k--; + arr.pop(); + } + arr.push(number[i]); + } + if(k>0){ + arr.splice(arr.length-k,k); + } + return arr.join(''); +} +``` +- 어차피 작은 수를 제거하기 위해서 앞의 더 작은 숫자를 먼저 빼내야 하기 때문에, FILO의 구조가 된다. +- FILO를 사용하기 위해 stack을 사용 +1. arr라는 스택을 사용하기 위한 변수 선언 +2. number길이만큼 for문을 만들고 그 안에 아래 조건을 가진 while문을 만듬 + 1. arr의 길이가 0보다 큼 + 2. arr의 마지막 변수가 지금 가리키고 있는 number보다 작음 + 3. k는 0보다 큼 +3. 이렇게 조건을 걸면, arr의 마지막 변수가 현재 가리키고 있는 number보다 클 때까지 stack에서 뺄 수 있고, 그렇게 되면 큰 숫자가 큰 자릿수에 올수가 있음 +4. 어차피 숫자의 길이는 number.length - k 이기 때문에, 큰 숫자가 큰 자릿수에 와야 큰 숫자가 만들어지게 됨 +5. 만약 2번 조건에 부합하지 않으면, 큰 숫자이기 때문에 arr에 현재 number를 push함 +6. 마지막으로 for문을 다 돌았는데도 k가 남아있는 경우, 마지막 k번째만큼 숫자를 빼주면 됨 +7. return으로 join을 사용하여 배열 -> 숫자로 변환하여 반환 \ No newline at end of file diff --git "a/2\354\243\274\354\260\250/2.md" "b/2\354\243\274\354\260\250/2.md" new file mode 100644 index 0000000..bd21bc9 --- /dev/null +++ "b/2\354\243\274\354\260\250/2.md" @@ -0,0 +1,28 @@ +#### 1. 문제 파악 +- 최소한의 미사일로 모든 폭격 미사일을 격추시키는 문제 +#### 2. 내 풀이 및 풀이방법 +``` javascript +function solution(targets) { + var answer = 0; + targets.sort(function (a, b) { + return a[1] - b[1]; + }); + var bomb = 0; + for(var i=0;i targets[i][0]) continue; + bomb = targets[i][1]; + answer++; + } + + return answer; +} + +``` + +<풀이법> +- 겹쳐지는 부분을 잡는 것보다, 폭탄의 위치를 갱신하는 방식으로 접근했다 +- 폭탄은 요격할 수 있는 범위의 최댓값에서 발사했을 때, 요격할 수 있는 미사일이 없으면 변경해야 한다. +- ![[Pasted image 20240827113423.png]] +- **솔직히 이 문제는 풀이법을 봐도 확 이해가 안되서 분석중에 있음** + +##### 느낀 점 diff --git "a/2\354\243\274\354\260\250/3.md" "b/2\354\243\274\354\260\250/3.md" new file mode 100644 index 0000000..fdaf74b --- /dev/null +++ "b/2\354\243\274\354\260\250/3.md" @@ -0,0 +1,20 @@ +https://school.programmers.co.kr/learn/courses/30/lessons/43105 + +#### 1. 문제 파악 +- 무적권을 사용하여 유저가 주어진 유닛 수로 최대로 갈 수 있는 라운드의 수를 구하는 문제 +#### 2. 내 풀이 및 풀이방법 +``` javascript +function solution(triangle) { + var answer = 0; + for(var i=triangle.length-1; i>=0; i--){ + for(var k=0;k 0) { + var max = arr[index]; + var maxIndex = index; + var count = 0; + // console.log('maxIdx :',maxIndex) + for(var i=index+1;i 0){ + k=k-count; + arr.splice(index,count) + } + index++; + // console.log(k, count, arr) + } + + answer = arr.join('') + // console.log(arr.join('')) + return answer; +} +``` +- 처음에 문제를 풀 당시, k가 0이 될 때까지 루프를 돌면서 index를 변경 +- ![[Pasted image 20240829101327.png]] +- 이런식으로 k길이만큼 최댓값을 구한 후 최솟값을 제거하는 방식으로 풀었으나, number의 길이가 커질수록 시간복잡도가 기하급수적으로 커지며, 로직이 복잡해져, 새로운 방식을 찾아야만 했음. +- 그래서 자료구조를 찾아보던 중 stack을 사용해 푸는 방법을 찾음 +``` javascript +function solution(number, k) { + var answer = ''; + var arr = []; + + for(var i=0; i 0 && arr[arr.length-1] < number[i] && k>0){ + k--; + arr.pop(); + } + arr.push(number[i]); + } + if(k>0){ + arr.splice(arr.length-k,k); + } + return arr.join(''); +} +``` +- 어차피 작은 수를 제거하기 위해서 앞의 더 작은 숫자를 먼저 빼내야 하기 때문에, FILO의 구조가 된다. +- FILO를 사용하기 위해 stack을 사용 +1. arr라는 스택을 사용하기 위한 변수 선언 +2. number길이만큼 for문을 만들고 그 안에 아래 조건을 가진 while문을 만듬 + 1. arr의 길이가 0보다 큼 + 2. arr의 마지막 변수가 지금 가리키고 있는 number보다 작음 + 3. k는 0보다 큼 +3. 이렇게 조건을 걸면, arr의 마지막 변수가 현재 가리키고 있는 number보다 클 때까지 stack에서 뺄 수 있고, 그렇게 되면 큰 숫자가 큰 자릿수에 올수가 있음 +4. 어차피 숫자의 길이는 number.length - k 이기 때문에, 큰 숫자가 큰 자릿수에 와야 큰 숫자가 만들어지게 됨 +5. 만약 2번 조건에 부합하지 않으면, 큰 숫자이기 때문에 arr에 현재 number를 push함 +6. 마지막으로 for문을 다 돌았는데도 k가 남아있는 경우, 마지막 k번째만큼 숫자를 빼주면 됨 +7. return으로 join을 사용하여 배열 -> 숫자로 변환하여 반환 \ No newline at end of file diff --git "a/2\354\243\274\354\260\250/5.md" "b/2\354\243\274\354\260\250/5.md" new file mode 100644 index 0000000..7fa86be --- /dev/null +++ "b/2\354\243\274\354\260\250/5.md" @@ -0,0 +1,42 @@ +#### 1. 문제 파악 +- 문제의 요점 : 모든 item항목을 담을 수 있는 최소한의 순차적인 인덱스의 길이 구하는 문제 + +#### 2. 내 풀이 + +``` javascript +function solution(gems) { + var answer = [1, gems.length]; + const gemMap = new Map(); + const gemsType = [...new Set(gems)]; + + gems.forEach((gem, i) => { + gemMap.delete(gem) + gemMap.set(gem, i) + if(gemMap.size == gemsType.length) { + var cand = [gemMap.values().next().value+1, i+1]; + answer = answer[1] - answer[0] > cand[1] - cand[0] ? cand : answer; + // if(answer[1]-answer[0] > cand[1]-cand[0]){ + // answer = cand + // } + } + }) + + return answer; +} +``` + +##### 풀이 방법 +- 처음 이 문제를 봤을 때, for문을 통해 하나씩 점검해가면 되겠다 싶어 gems의 중복값을 제거해 set데이터형을 구축한 후 while-for문을 통해 찾으려고 시도했으나 최대 10만개의 item들을 확인하기에 시간적으로 오래 걸릴 것이라 판단해 새로운 방법을 찾기 시작함 +- 인터넷에서 방법을 찾다 보니, map을 통해 푸는 로직을 발견했음 +- gemsType은 gems의 type들을 가진 set형 +- gems의 item을 순차적으로 확인하면서, + 1. map에 이미 동일한 gem이 있으면 map에서 삭제 + 2. gem값이랑 index를 map에 저장 + 3. gemMap의 길이랑 gemsType의 길이가 같은 경우, 모든 gems들이 있다고 판단 + 4. map에 모든 gems들이 들어가있을 때, gemMap에 있는 index중 가장 작은 값, 현재 index값을 cand에 할당 + - gemMap.values() : map의 값들을 오름차순으로 정렬하여 반환 + - next() : map의 다음 값을 반환 + 5. answer에 있는 값의 길이와 cand에 있는 값의 길이 비교하여 cand이 짧은 경우, answer에 cand의 값을 할당 + +##### 느낀 점 +javascript로 코딩테스트 문제를 풀면서 기본적인 javascriptㅇ \ No newline at end of file From 8a57443b63afcc7f4bb22d76aab5ef39a7c13ae7 Mon Sep 17 00:00:00 2001 From: JK <74600256+Programmer-JK@users.noreply.github.com> Date: Thu, 29 Aug 2024 10:41:01 +0900 Subject: [PATCH 3/3] modify folder --- .../Level 2 \353\257\270\353\241\234\355\203\210\354\266\234.md" | 0 .../Level2 \353\215\224 \353\247\265\352\262\214.md" | 0 ...3\247\211\353\214\200 \352\267\270\353\236\230\355\224\204.md" | 0 ...55\203\200\354\233\214\353\224\224\355\216\234\354\212\244.md" | 0 .../Level2 \355\203\235\353\260\260\354\203\201\354\236\220.md" | 0 .../2\354\243\274\354\260\250/1.md" | 0 .../2\354\243\274\354\260\250/2.md" | 0 .../2\354\243\274\354\260\250/3.md" | 0 .../2\354\243\274\354\260\250/4.md" | 0 .../2\354\243\274\354\260\250/5.md" | 0 10 files changed, 0 insertions(+), 0 deletions(-) rename "1\354\243\274\354\260\250/Level 2 \353\257\270\353\241\234\355\203\210\354\266\234.md" => "members/\353\260\225\354\242\205\352\266\214/1\354\243\274\354\260\250/Level 2 \353\257\270\353\241\234\355\203\210\354\266\234.md" (100%) rename "1\354\243\274\354\260\250/Level2 \353\215\224 \353\247\265\352\262\214.md" => "members/\353\260\225\354\242\205\352\266\214/1\354\243\274\354\260\250/Level2 \353\215\224 \353\247\265\352\262\214.md" (100%) rename "1\354\243\274\354\260\250/Level2 \353\217\204\353\204\233\352\263\274 \353\247\211\353\214\200 \352\267\270\353\236\230\355\224\204.md" => "members/\353\260\225\354\242\205\352\266\214/1\354\243\274\354\260\250/Level2 \353\217\204\353\204\233\352\263\274 \353\247\211\353\214\200 \352\267\270\353\236\230\355\224\204.md" (100%) rename "1\354\243\274\354\260\250/Level2 \355\203\200\354\233\214\353\224\224\355\216\234\354\212\244.md" => "members/\353\260\225\354\242\205\352\266\214/1\354\243\274\354\260\250/Level2 \355\203\200\354\233\214\353\224\224\355\216\234\354\212\244.md" (100%) rename "1\354\243\274\354\260\250/Level2 \355\203\235\353\260\260\354\203\201\354\236\220.md" => "members/\353\260\225\354\242\205\352\266\214/1\354\243\274\354\260\250/Level2 \355\203\235\353\260\260\354\203\201\354\236\220.md" (100%) rename "2\354\243\274\354\260\250/1.md" => "members/\353\260\225\354\242\205\352\266\214/2\354\243\274\354\260\250/1.md" (100%) rename "2\354\243\274\354\260\250/2.md" => "members/\353\260\225\354\242\205\352\266\214/2\354\243\274\354\260\250/2.md" (100%) rename "2\354\243\274\354\260\250/3.md" => "members/\353\260\225\354\242\205\352\266\214/2\354\243\274\354\260\250/3.md" (100%) rename "2\354\243\274\354\260\250/4.md" => "members/\353\260\225\354\242\205\352\266\214/2\354\243\274\354\260\250/4.md" (100%) rename "2\354\243\274\354\260\250/5.md" => "members/\353\260\225\354\242\205\352\266\214/2\354\243\274\354\260\250/5.md" (100%) diff --git "a/1\354\243\274\354\260\250/Level 2 \353\257\270\353\241\234\355\203\210\354\266\234.md" "b/members/\353\260\225\354\242\205\352\266\214/1\354\243\274\354\260\250/Level 2 \353\257\270\353\241\234\355\203\210\354\266\234.md" similarity index 100% rename from "1\354\243\274\354\260\250/Level 2 \353\257\270\353\241\234\355\203\210\354\266\234.md" rename to "members/\353\260\225\354\242\205\352\266\214/1\354\243\274\354\260\250/Level 2 \353\257\270\353\241\234\355\203\210\354\266\234.md" diff --git "a/1\354\243\274\354\260\250/Level2 \353\215\224 \353\247\265\352\262\214.md" "b/members/\353\260\225\354\242\205\352\266\214/1\354\243\274\354\260\250/Level2 \353\215\224 \353\247\265\352\262\214.md" similarity index 100% rename from "1\354\243\274\354\260\250/Level2 \353\215\224 \353\247\265\352\262\214.md" rename to "members/\353\260\225\354\242\205\352\266\214/1\354\243\274\354\260\250/Level2 \353\215\224 \353\247\265\352\262\214.md" diff --git "a/1\354\243\274\354\260\250/Level2 \353\217\204\353\204\233\352\263\274 \353\247\211\353\214\200 \352\267\270\353\236\230\355\224\204.md" "b/members/\353\260\225\354\242\205\352\266\214/1\354\243\274\354\260\250/Level2 \353\217\204\353\204\233\352\263\274 \353\247\211\353\214\200 \352\267\270\353\236\230\355\224\204.md" similarity index 100% rename from "1\354\243\274\354\260\250/Level2 \353\217\204\353\204\233\352\263\274 \353\247\211\353\214\200 \352\267\270\353\236\230\355\224\204.md" rename to "members/\353\260\225\354\242\205\352\266\214/1\354\243\274\354\260\250/Level2 \353\217\204\353\204\233\352\263\274 \353\247\211\353\214\200 \352\267\270\353\236\230\355\224\204.md" diff --git "a/1\354\243\274\354\260\250/Level2 \355\203\200\354\233\214\353\224\224\355\216\234\354\212\244.md" "b/members/\353\260\225\354\242\205\352\266\214/1\354\243\274\354\260\250/Level2 \355\203\200\354\233\214\353\224\224\355\216\234\354\212\244.md" similarity index 100% rename from "1\354\243\274\354\260\250/Level2 \355\203\200\354\233\214\353\224\224\355\216\234\354\212\244.md" rename to "members/\353\260\225\354\242\205\352\266\214/1\354\243\274\354\260\250/Level2 \355\203\200\354\233\214\353\224\224\355\216\234\354\212\244.md" diff --git "a/1\354\243\274\354\260\250/Level2 \355\203\235\353\260\260\354\203\201\354\236\220.md" "b/members/\353\260\225\354\242\205\352\266\214/1\354\243\274\354\260\250/Level2 \355\203\235\353\260\260\354\203\201\354\236\220.md" similarity index 100% rename from "1\354\243\274\354\260\250/Level2 \355\203\235\353\260\260\354\203\201\354\236\220.md" rename to "members/\353\260\225\354\242\205\352\266\214/1\354\243\274\354\260\250/Level2 \355\203\235\353\260\260\354\203\201\354\236\220.md" diff --git "a/2\354\243\274\354\260\250/1.md" "b/members/\353\260\225\354\242\205\352\266\214/2\354\243\274\354\260\250/1.md" similarity index 100% rename from "2\354\243\274\354\260\250/1.md" rename to "members/\353\260\225\354\242\205\352\266\214/2\354\243\274\354\260\250/1.md" diff --git "a/2\354\243\274\354\260\250/2.md" "b/members/\353\260\225\354\242\205\352\266\214/2\354\243\274\354\260\250/2.md" similarity index 100% rename from "2\354\243\274\354\260\250/2.md" rename to "members/\353\260\225\354\242\205\352\266\214/2\354\243\274\354\260\250/2.md" diff --git "a/2\354\243\274\354\260\250/3.md" "b/members/\353\260\225\354\242\205\352\266\214/2\354\243\274\354\260\250/3.md" similarity index 100% rename from "2\354\243\274\354\260\250/3.md" rename to "members/\353\260\225\354\242\205\352\266\214/2\354\243\274\354\260\250/3.md" diff --git "a/2\354\243\274\354\260\250/4.md" "b/members/\353\260\225\354\242\205\352\266\214/2\354\243\274\354\260\250/4.md" similarity index 100% rename from "2\354\243\274\354\260\250/4.md" rename to "members/\353\260\225\354\242\205\352\266\214/2\354\243\274\354\260\250/4.md" diff --git "a/2\354\243\274\354\260\250/5.md" "b/members/\353\260\225\354\242\205\352\266\214/2\354\243\274\354\260\250/5.md" similarity index 100% rename from "2\354\243\274\354\260\250/5.md" rename to "members/\353\260\225\354\242\205\352\266\214/2\354\243\274\354\260\250/5.md"