하루 알고리즘(JS)

    [바미] 슬라이딩 윈도우 기법

    시작 안녕하세요. 지난번에 체스판 다시 칠하기문제를 풀면서 사용한 윈도우 슬라이딩 기법에 대해 자세히 알아보기 위해 포스팅을 해보려 합니다. 슬라이딩 윈도우 기법? 체스판 다시 칠하기 문제에서 설명했듯이 슬라이딩 윈도우 기법은 배열이나 리스트의 항목을 순차적으로 탐색할 때 사용하는 알고리즘 기법 중 하나입니다. 이 기법은 "창" 또는 "윈도우"라고 할 수 있는 고정된 크기의 부분 배열이나 서브 리스트를 이동시키면서 문제를 해결합니다. 이 윈도우는 데이터 구조를 통해 한 번에 한 항목씩 앞으로 이동하면서 연속적인 데이터의 범위를 처리합니다. 보통 슬라이딩 윈도우 기법은 아래와 같은 상황에서 사용하면 굉장히 유용합니다. 배열이나 리스트에서 고정된 크기의 윈도우를 슬라이드하면서, 각 윈도우에 대한 최대값 또는..

    [바미] 체스판 다시 칠하기

    문제 https://www.acmicpc.net/problem/1018 1018번: 체스판 다시 칠하기 첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다. www.acmicpc.net 코드 및 코드 설명 const input = require('fs').readFileSync('/dev/stdin').toString().split('\n'); const [N, M] = input[0].split(" ").map(Number); // 보드 상태를 2D 배열로 저장 const board = input.slice(1, N + 1); function countRepaint..

    [바미] 수학은 비대면강의입니다

    문제 https://www.acmicpc.net/problem/19532 19532번: 수학은 비대면강의입니다 정수 $a$, $b$, $c$, $d$, $e$, $f$가 공백으로 구분되어 차례대로 주어진다. ($-999 \leq a,b,c,d,e,f \leq 999$) 문제에서 언급한 방정식을 만족하는 $\left(x,y\right)$가 유일하게 존재하고, 이 때 $x$와 $y$가 각각 $- www.acmicpc.net 코드 const input = require('fs').readFileSync('/dev/stdin').toString().split(' '); const [a, b, c, d, e, f] = input.map(Number); // 계수 행렬의 결정자 const delta = a * e ..

    [바미] 분해합

    https://www.acmicpc.net/problem/2231 2231번: 분해합 어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 www.acmicpc.net 코드 및 코드 설명 const input = require('fs').readFileSync('/dev/stdin').toString().trim(); const N = Number(input); function findSmallestConstructor(N) { // N을 만들 수 있는 최소의 M을 찾기 위해, 1부터 N까지 모든 수에 대해 검사 for (let M ..

    [바미] 블랙잭

    문제 https://www.acmicpc.net/problem/2798 2798번: 블랙잭 첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장 www.acmicpc.net 코드 const input = require('fs').readFileSync('/dev/stdin').toString().split('\n'); const [N, M] = input[0].split(" ").map((a) => Number(a)); // 첫 번째 줄에서 N과 M을 읽어옴. const cards = input[1].split(" ").map((..

    [바미] 알고리즘 수업 - 점근적 표기 1

    https://www.acmicpc.net/problem/24313 24313번: 알고리즘 수업 - 점근적 표기 1 f(n) = 7n + 7, g(n) = n, c = 8, n0 = 1이다. f(1) = 14, c × g(1) = 8이므로 O(n) 정의를 만족하지 못한다. www.acmicpc.net 코드 const input = require('fs').readFileSync('/dev/stdin').toString().split('\n'); const n = Number(input[2]) const [a1, a0] = input[0].split(" ").map((a) => Number(a)) const fnSum = a1 * n + a0 const g = Number(input[1]) const gn..

    [바미] 알고리즘 수업 - 알고리즘의 수행 시간 6

    https://www.acmicpc.net/problem/24267 코드 const input = require('fs').readFileSync(process.platform === "linux" ? "/dev/stdin" : "./input.txt").toString().trim(); const result = ( BigInt(input) * BigInt(input - 1) * BigInt(input - 2) ) / BigInt(6); console.log(`${result}\n${3}`); 문제 설명 문제는 주어진 MenOfPassion 알고리즘에 대한 수행 시간을 분석하고, 그 결과를 특정 형식으로 출력하는 문제인데요. MenOfPassion 알고리즘은 세 개의 중첩된 for 반복문을 사용하여 특..

    [바미]알고리즘 수업 - 알고리즘의 수행 시간 5

    https://www.acmicpc.net/problem/24266 24266번: 알고리즘 수업 - 알고리즘의 수행 시간 5 오늘도 서준이는 알고리즘의 수행시간 수업 조교를 하고 있다. 아빠가 수업한 내용을 학생들이 잘 이해했는지 문제를 통해서 확인해보자. 입력의 크기 n이 주어지면 MenOfPassion 알고리즘 수행 시 www.acmicpc.net 코드 function menOfPassionAlgorithmPerformance(n) { // n을 BigInt로 변환 const bigN = BigInt(n); // BigInt를 사용하여 n^3 계산 const result = bigN ** BigInt(3); console.log(result.toString()); // 코드1의 수행 횟수를 문자열로 ..

    [바미] 알고리즘 수업 - 알고리즘의 수행 시간 4

    https://www.acmicpc.net/problem/24265 24265번: 알고리즘 수업 - 알고리즘의 수행 시간 4 오늘도 서준이는 알고리즘의 수행시간 수업 조교를 하고 있다. 아빠가 수업한 내용을 학생들이 잘 이해했는지 문제를 통해서 확인해보자. 입력의 크기 n이 주어지면 MenOfPassion 알고리즘 수행 시 www.acmicpc.net 코드 function menOfPassionAlgorithmPerformance(n) { // 코드1의 수행 횟수, n(n-1)/2번 console.log((n * (n - 1)) / 2); // 코드1의 수행 횟수를 다항식으로 나타냈을 때, 최고차항의 차수는 2 console.log(2); } const readline = require('node:rea..