문제 후위 연산식이 주어지면 계산한 값을 출력하시오. 식은 1~9의 숫자와 +, -, *, / 연산자로만 이루어집니다. 98+2*1-6+은 (8+9)*2-1+6와 같다. 입력 예제 98+2*1-6+ 출력 예제 39 풀이 function solution(s) { let answer = 0; let stack = []; for (let x of s) { // 숫자일 경우 if(!isNaN(x)) stack.push(Number(x)); else { // 요소 두 개를 꺼낸다. let rt = stack.pop(); let lt = stack.pop(); if (x === '+') stack.push(lt + rt); else if (x === '-') stack.push(lt - rt); else if (x..
문제 소괄호 사이에 있는 모든 문자를 제거하고 남은 문자만 출력하시오. 입력 예제 (A(B)C)DE(FG(H)IJ)K(LM)(N) 출력 예제 DEK 풀이 function solution(s){ let answer = ""; let stack = []; for (let x of s) { if (x === ')') { // 여는 괄호가 나올 때까지 while(stack.pop() !== '('); } else stack.push(x); } answer = stack.join(""); return answer; }
문제 두 문자열에서 아나그램이 되는 부분 문자열의 개수를 구하는 프로그램을 작성하시오. 대소문자는 구분됩니다. 입력 예제 cabbAcabc abc 출력 예제 3 풀이 // 두 해시 비교 function compareMaps(map1, map2){ // size가 다르다면 서로 다른 게 담겼다는 의미 if(map1.size!==map2.size) return false; // size는 같은데 // map2에 해당 키가 없거나 // map2에서 해당 키를 가져왔는데 값이 다른 경우 for(let [key, val] of map1){ if(!map2.has(key) || map2.get(key)!==val) return false; } return true; } function solution(s, t){ ..
💡 아나그램이란, 두 문자열의 나열 순서는 다르지만 구성이 일치한 것을 말한다. 문제 두 문자열이 아나그램인지 판단하는 프로그램을 작성하시오. 대소문자는 구분됩니다. 입력 예제 1 ABcdefc BAcdfce 출력 예제 1 YES 풀이 function solution(a, b) { let answer = "YES"; let hash1 = new Map(); for (let x of a) { // 이미 존재하면 if (hash1.has(x)) hash1.set(x, hash1.get(x) + 1); // 없으면 else hash1.set(x, 1); } // 두 번째 문자열을 순환하면서 hash1에 있으면 -1 // hash1에 해당 값이 없거나 value가 0이면 아나그램 아님 for (let x of ..
문제 N개의 투표 용지에 A, B, C, D, E 각 후보의 기호가 적혀져 있습니다. 투표 용지에 쓰여진 기호가 발표된 순서대로 입력하면, 누가 학급 회장이 되었는지 출력하는 프로그램을 작성하시오. 입력 예제 10 ABBACCACED 출력 예제 A 풀이 function solution(n, s) { let answer; let hash = new Map(); for (let x of s) { // 해당 문자열이 해시에 존재하면, // 기존 값을 get으로 가져와서 1 증가 if (hash.has(x)) hash.set(x, hash.get(x)+1); // 해당 문자열이 해시에 존재하지 않으면, key와 value 생성 else hash.set(x, 1); } let max = Number.MIN_SAF..
💡 슬라이딩 윈도 크기가 고정된 프레임이 좌우로 움직이면서 프레임 안에 있는 데이터를 이용해 계산하는 알고리즘 문제 N일 동안의 매출액을 입력 받으면 연속된 K일 동안 최대 매출액이 얼마인지 구하시오. 입력 예제 10 3 10 25 11 20 15 12 20 10 22 18 출력 예제 56 풀이 function solution(n, m, a) { let answer = sum = 0; // 처음 3개 더하기 for (let i = 0; i < m; i++) sum += a[i]; answer = sum; // 슬라이딩 윈도 for (let i = m; i < a.length; i++) { // i번째 + i에서 4번째 앞에 있는 요소 빼기 sum += (a[i] - a[i-m]); answer = Mat..
문제 N개의 숫자로 이루어진 수열이 있습니다. 연속 부분 수열의 합이 M 이하가 되는 경우가 몇 번인지 출력하시오. 입력 예제 6 4 1 3 1 1 2 1 출력 예제 13 풀이 function solution(n, m, a) { let answer = lt = rt = sum = 0; for (let rt = 0; rt m) { sum -= a[lt++]; } answer += (rt - lt + 1); } return answer; }
문제 N개의 수열과 자연수 M이 입력됩니다. 연속된 부분 수열의 합이 M이 되는 경우가 몇 번 있는지 출력하는 프로그램을 작성하시오. 입력 예제 8 4 1 3 1 1 2 2 1 2 출력 예제 4 풀이 투 포인터를 이용해 탐색한다. function solution(n, m, a) { let answer = lt = rt = sum = 0; for (let rt = 0; rt = m) { sum -= a[lt++]; // a의 lt 값을 뺀 다음 lt++ if (sum === m) answer++; } } return answer; }
문제 N개의 자연수가 입력되면, 숫자를 뒤집고 뒤집은 숫자가 소수일 경우 출력하시오. 입력 예제 [30, 37, 109, 112, 43] 출력 예제 [3, 73, 211] 풀이 방법 1 // 소수 판별 함수 function isPrime(num) { if(num===1) return false; // 1은 소수가 아니다. // 해당 숫자를 2~자기자신만큼 나눴을 때 // 중간에 나머지 없이 나뉘는 게 있다면 소수가 아님 for (let i = 2; i < parseInt(num/2); i++) { if(num % i === 0) return false; } return true; } function solution(arr) { let answer = []; for (let x of arr) { let r..
💡 Two Pointer 두 개의 포인터 변수를 사용하여 기록하면서 처리하는 알고리즘 문제 오름차순으로 정렬된 두 배열을 합쳐 새로운 오름차순 배열로 출력하시오. 입력 예제 2 4 5 6 1 2 6 8 10 출력 예제 1 2 2 4 5 6 6 8 10 풀이 두 개의 각 배열에 포인터를 하나씩 두고 탐색하면서 작은 값을 answer에 담는다. function solution(a, b) { let answer = []; let n = a.length; let m = b.length; let p1 = p2 = 0; // 두 배열 중 한 배열의 탐색이 끝나면 반복 종료 while (p1 < n && p2 < m) { if (a[p1]