코딩테스트 문제풀이/inflearn

[인프런] Node.js / 섹션6-자료구조(스택) / 1. 올바른 괄호

괄호가 입력되면 올바른 괄호이면 “YES", 올바르지 않으면 ”NO"를 출력 (())() 이것은 괄호의 쌍이 올바르게 위치하는 거지만, (()()))은 올바른 괄호가 아니다. 풀이 function solution(s) { let answer = "YES"; const stack = []; for (let x of s) { if (x === "(") stack.push(x); else { if (stack.length === 0) return "NO"; stack.pop(); } } if (stack.length > 0) return "NO"; return answer; } let a = "(()(()))(()"; console.log(solution(a)); 여는 괄호 만나면 stack에 넣고, 닫는 괄..

[인프런] Node.js / 섹션5-효율성(해시&슬라이싱 윈도우&투포인터 알고리즘) / 8. 모든 아나그램 찾기

S문자열에서 T문자열과 아나그램이 되는 S의 부분문자열의 개수를 구하는 프로그램을 작성하세요. 아나그램 판별시 대소문자가 구분됩니다. 부분문자열은 연속된 문자열이어야 합니다. 첫 줄에 첫 번째 S문자열이 입력되고, 두 번째 줄에 T문자열이 입력됩니다. S문자열의 길이는 10,000을 넘지 않으며, T문자열은 S문자열보다 길이가 작거나 같습니다. 풀이 let answer = 0; function isAnagram(arr, t) { let sHCopy = new Map(arr); // 원본 수정하면 안되므로 복사본 만듦 for (let j = 0; j < t.length; j++) { if (!sHCopy.has(t[j]) || sHCopy.get(t[j]) == 0) break; sHCopy.set(t[j..

[인프런] Node.js / 섹션5-효율성(해시 알고리즘) / 7. 아나그램

Anagram이란 두 문자열이 알파벳의 나열 순서를 다르지만 그 구성이 일치하면 두 단어는 아나그램이라고 합니다. 예를 들면 AbaAeCe 와 baeeACA 는 알파벳을 나열 순서는 다르지만 그 구성을 살펴보면 A(2), a(1), b(1), C(1), e(2)로 알파벳과 그 개수가 모두 일치합니다. 즉 어느 한 단어를 재 배열하면 상대편 단어가 될 수 있는 것을 아나그램이라 합니다. 길이가 같은 두 개의 단어가 주어지면 두 단어가 아나그램인지 판별하는 프로그램을 작성하세 요. 아나그램 판별시 대소문자가 구분됩니다. 풀이 function solution(str1, str2) { let answer = "YES"; let sH1 = new Map(); let sH2 = new Map(); for (let ..

[인프런] Node.js / 섹션5-효율성(해시 알고리즘) / 6. 학급 회장

학급 회장을 뽑는데 후보로 기호 A, B, C, D, E 후보가 등록을 했습니다. 투표용지에는 반 학생들이 자기가 선택한 후보의 기호(알파벳)가 쓰여져 있으며 선생님은 그 기호를 발표하고 있습니다. 선생님의 발표가 끝난 후 어떤 기호의 후보가 학급 회장이 되었는지 출력하는 프로그램을 작성하세요. 반드시 한 명의 학급회장이 선출되도록 투표결과가 나왔다고 가정합니다. 풀이 function solution(s) { let answer; let sH = new Map(); // Map 빈 객체 생성 for (let x of s) { if (sH.has(x)) sH.set(x, sH.get(x) + 1); // 해당 문자 key가 존재하면 카운팅 else sH.set(x, 1); // 없으면 key를 만들고 값을..

[인프런] Node.js / 섹션5-효율성(슬라이싱 윈도우 알고리즘) / 5. 최대 매출

N일 동안의 매출기록을 주고 연속 된 K일 동안의 최대 매출액이 얼마인지 구하기 만약 N=10이고 10일 간의 매출기록이 아래와 같다. 이때 K=3이면 12 15 11 20 25 10 20 19 13 15 연속된 3일간의 최대 매출액은 11+20+25=56만원이다. 풀이 function solution(k, arr) { let sum = 0; for (let i = 0; i max) max = sum; } return max; } let a = [12, 15, 11, 20, 25, 10, 20, 1..

[인프런] Node.js / 섹션5-효율성(투포인터 알고리즘) / 4. 연속 부분수열 2

N개의 수로 이루어진 수열, 이 수열에서 연속부분수열의 합이 특정숫자 M이하가 되는 경우가 몇 번 있는지 구하기. 예를들어 N=5, M=5이고 수열이 1 3 1 2 3 라면, 합이 5이하가 되는 연속부분수열은 {1}, {3}, {1}, {2}, {3}, {1, 3}, {3, 1}, {1, 2}, {2, 3}, {1, 3, 1}로 총 10가지 풀이 function solution(m, arr) { let answer = 0; let sum = 0; let lt = 0; for (let rt = 0; rt m) { sum -= arr[lt++]; } answer += rt - lt + 1; } return answer..

[인프런] Node.js / 섹션5-효율성(투포인터 알고리즘) / 3. 연속 부분수열 1

N개의 수로 이루어진 수열, 이 수열에서 연속부분수열의 합이 특정숫자 M이 되는 경우가 몇 번 있는지 구하기. 예를들어 N=8, M=6이고 수열이 1 2 1 3 1 1 1 2 라면, 합이 6이 되는 연속부분수열은 {2, 1, 3}, {1, 3, 1, 1}, {3, 1, 1, 1}로 총 3가지 풀이 function solution(m, arr) { let p1 = 0; let p2 = 0; let count = 0; let subtotal = arr[p2]; while (p1 < arr.length && p2 < arr.length) { if (subtotal < m) { subtotal += arr[++p2]; } else { subtotal -= arr[p1++]; } if (subtotal === m..

[인프런] Node.js / 섹션5-효율성(투포인터 알고리즘) / 2. 공통원소 구하기

A, B 두 개의 집합(중복 원소x)이 주어지면 두 집합의 공통 원소를 추출하여 오름차순으로 출력 나의 풀이 function solution(arr1, arr2) { let answer = []; let n = arr1.length; let m = arr2.length; let p1 = 0; let p2 = 0; while (p1 m) { p1++; p2 = 0; } } } answer.sort((a, b) => a - b); return answer; } let a = [1, 3, 9, 5, 2]; let b = [3, 2, 5, 7, 8..