목록알고리즘 (51)
미누에요

이 문제는 숫자들을 받아 산술평균, 중앙값, 최빈값, 범위를 출력하는 구현 문제이다. 이 문제에서 발생할 수 있는 문제점으로는 -0이 출력되는 경우이다. 그 외에는 모두 수학 개념적인 부분을 구현하면 된다. 나는 이 문제에서 -0이 발생할 때 이를 해결하기 위해 fixNagativeZero라는 함수를 따로 구현하여 사용하였다.const fixNegativeZero = (num) => (Object.is(num, -0) ? 0 : num); 또한 최빈값을 찾는 문제에서, 배열의 각 요소들에 대해 Map을 사용하여 더 효율적으로 최빈값을 구하도록 하였다.// 최빈값const freqMap = new Map();let maxFreq = 0;let mostFrequent = [];for (let num of ..

이 문제는 두 수를 받아 그 사이의 수들 중 소수를 출력하는 문제이다.일반적인 소수 판별 기법을 사용한다면 메모리 제한 때문에 정답이 나오지 않는다. 따라서 우리는 에라토스테네스의 체(Sieve of Eratosthenes)를 사용해야 한다. 에라토스테네스의 체(Sieve of Eratosthenes)란?에라토스테네스의 체는 특정 범위 내에서 모든 소수를 빠르게 찾는 알고리즘이 방법은 배수를 제거하는 방식으로 소수를 판별하며, **O(N log log N)**의 시간 복잡도를 가진다. 1부터 N까지의 숫자를 담은 배열을 생성하고, 모든 숫자를 소수라고 가정예: N = 10 → [true, true, true, true, true, true, true, true, true, true, true]true..

이 문제는 데이터의 개수와 데이터를 순차적으로 받아 절사평균을 구하는 문제이다. 절사 평균이란, 상위 및 하위에서 특정 범위를 제거한 후에 측정한 평균이다.예를 들어, 30% 절삭평균은 상위 하위 각각 15%를 삭제하고 남은 데이터를 가지고 평균을 구한 값이다. 처음에는 data에 각각 15%의 개수만큼 pop()과 shift()를 수행했지만, 문제에서 오답이라고 판단하여 slice를 사용하여 배열을 부분적으로 잘라내 사용하였다. 소스 코드const input = require('fs') .readFileSync('/dev/stdin') .toString() .trim() .split('\n');const n = Number(input[0]);if (n === 0) { console.log(0); ..

이 문제는 원형 리스트로 입력받은 숫자까지 순서대로 리스트를 만든 후에, 찾은 인덱스에 대한 처리를 어떻게 할지가 조금 고민되는 문제였다. 나는 출력된 요소에 대해 삭제하는 방법을 택했고, JavaScript의 splice 함수를 사용했다. 그리고 삭제한 후의 규칙성을 확인해보면 아래와 같다. 배열 길이가 계속해서 감소하지만, 이전 배열과 다음 배열(감소된 배열)의 인덱스 차이가 2로 일정한 것을 확인했다. 이는 입력값으로 받은 3-1의 값으로 나타낼 수 있게 된다. 따라서 단계에 따라 i * (3-1) 의 식을 사용하여 이 문제를 해결할 수 있게된다. 소스 코드const input = require('fs') .readFileSync('/dev/stdin') .toString() .trim() .spl..

이전에 풀었던 스택 문제와 비슷하다.이전 스택 코드에서 부분적으로 수정하여 제출하였다. 마찬가지로 JavaScript는 배열에 대하여 shift라는 메서드가 존재한다.shift 는 첫번째 요소를 반환하는 메서드이다. 따라서 queue를 직접 구현하지 않고 코드를 작성하였다. 소스 코드const input = require('fs') .readFileSync('/dev/stdin') .toString() .trim() .split('\n');const num = +input.shift();const queue = [];const result = [];input.forEach((sentence) => { const [command, value] = sentence.split(' '); if (command..

이 문제는 한줄씩 오는 명령을 보고 스택의 각 기능을 수행하는 문제이다. 다른 언어로 진행했다면 스택도 구현해야 했겠지만 JavaScript는 기본적으로 스택의 push, pop을 지원하기 때문에 손쉽게 코드를 작성할 수 있었다.forEach를 사용하여 한줄씩 명령을 수행하도록 하였고, undefined가 출력되지 않도록 출력 배열 또한 만들어 수행하였다. 소스 코드const input = require('fs') .readFileSync('/dev/stdin') .toString() .trim() .split('\n');const num = +input.shift();const stack = [];const result = [];input.forEach((sentence) => { const [comm..

이제는 문제를 보고 사용될 알고리즘도 같이 보기 시작했다. 이 문제에서는 사용된 알고리즘으로 아래와 같이 표시되어 있다.자료 구조정렬이분 탐색해시를 사용한 집합과 맵 이분 탐색과 정렬은 정렬하여 이진 탐색을 통해 요소를 찾는구나 싶었지만 해시를 사용한 집합과 맵은 도대체 왜 사용해야하는지 이해가 되지 않았다. 그래서 해시와 맵을 찾아본 결과 해시는 간단히 설명하자면 키-값으로 이루어진 자료구조고, 배열과 다르게 키 값으로 문자열이 올 수 있다는 것이었다.또한 집합은 요소들의 중복을 금지하기에 어떻게 이 두 가지 자료구조를 활용할지 생각이 나지 않았다. 그러던 도중 집합으로 만들되, 숫자를 키로, 각 요소의 개수를 값으로 하는 해시맵을 만들어 사용하면 어떨까 ? 라는 생각이 들었다. 그러니까 10 - 3..

이 문제는 막 복잡한 문제는 아닌 거 같다.문제에서 값이 0인 경우에 가장 최근에 쓴 수를 지우고, 아닐 경우 해당 숫자를 기록한다고 되어있다. 이 개념은 정확히 스택의 개념에 맞아떨어진다.값이 0인 경우에 가장 최근에 쓴 수를 지우는 것은 stack의 pop()이고, 해당 숫자를 기록하는 것은 stack의 push()이다. 아래는 소스 코드이다. 소스 코드const input = require('fs') .readFileSync('/dev/stdin') .toString() .trim() .split('\n');const num = input.shift();const stack = [];input.forEach((ele) => { ele = +ele; if (ele === 0) { stack.pop..

이 문제도 스택을 사용하여 이전 문제처럼 풀면 되겠다. 이전 문제와 너무 동일하므로 자세한 설명은 생략한다. 소스 코드const input = require('fs') .readFileSync('/dev/stdin') .toString() .trim() .split('\n');const num = input.shift();const results = [];input.forEach((line) => { const stack = []; let isBalanced = true; for (const char of line) { if (char === '(' || char === '[') { stack.push(char); } else if (char === ')') { if (stack.pop() ..

이 문제는 학부 자료구조 시간에 배웠던 내용인듯하다.스택(Stack)을 사용하여 괄호를 검사하는 문제인데, 간단히 설명하자면 문장을 순서대로 토큰으로 탐색하면서 여는 괄호('(', '[')가 오면 스택에 저장하고(push), 닫는 괄호(')', ']')가 오면 스택에 있던 값을 꺼내(pop) 여는 괄호인지 확인하면 된다. 아 그리고, 마지막의 .은 종료를 시키도록 작성해야한다.(문제에서 종료 조건으로 설정되어있음) 소스 코드const input = require('fs') .readFileSync('/dev/stdin') .toString() .trim() .split('\n');const results = [];input.forEach((line) => { if (line === '.') return;..