문제 정보 왕국의 이웃 나라 외동딸 공주가 숲속의 괴물에게 잡혀갔습니다. 정보 왕국에는 왕자가 N명이 있는데 서로 공주를 구하러 가겠다고 합니다. 정보왕국의 왕은 다음과 같은 방법으로 공주를 구하러 갈 왕자를 결정하기로 했습니다. 왕은 왕자들을 나이 순으로 1번부터 N번까지 차례로 번호를 매긴다. 그리고 1번 왕자부터 N 번 왕자까지 순서대로 시계 방향으로 돌아가며 동그랗게 앉게 한다. 그리고 1번 왕자부터 시 계방향으로 돌아가며 1부터 시작하여 번호를 외치게 한다. 한 왕자가 K(특정숫자)를 외치면 그 왕자는 공주를 구하러 가는데서 제외되고 원 밖으로 나오게 된다. 그리고 다음 왕자부터 다시 1부터 시작하여 번호를 외친다. 이렇게 해서 마지막까지 남은 왕자가 공주를 구하러 갈 수 있다. 예를 들어 총 ..
문제 후위 연산식이 주어지면 계산한 값을 출력하시오. 식은 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..