[알고리즘 연습] 백준 16987 (계란으로 계란치기, 자바스크립트)
·
알고리즘 연습
문제 16987번: 계란으로 계란치기 원래 프로그래머의 기본 소양은 팔굽혀펴기를 단 한 개도 할 수 없는 것이라고 하지만 인범이는 3대 500을 넘기는 몇 안되는 프로그래머 중 한 명이다. 인범이는 BOJ에서 틀린 제출을 할 때마다 턱 www.acmicpc.net 풀이 왼쪽부터 마지막 계란까지 손에 들 계란을 증가시켜야 하기 때문에 재귀를 돌 때마다 idx를 증가시킨다. 재귀 함수 내부 for문에서는 아직 깨지지 않은 계란을 선택해 치는 작업을 수행한다. 재귀를 돌고 복귀할 때 반드시 계란의 내구성을 원상복구 해준다. 소스 코드 const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt"; const input = require..
[알고리즘 연습] 백준 14888 (연산자 끼워넣기, 자바스크립트)
·
알고리즘 연습
문제 14888번: 연산자 끼워넣기 첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱 www.acmicpc.net 소스 코드 const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt"; const input = require("fs") .readFileSync(filePath) .toString() .trim() .split("\n"); const N = +input[0]; const arr = input[1].split(" ").ma..
[알고리즘 연습] 백준 13549 (숨바꼭질 3, 자바스크립트)
·
알고리즘 연습
문제 13549번: 숨바꼭질 3 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 www.acmicpc.net 소스 코드 const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt'; const input = require('fs') .readFileSync(filePath) .toString() .trim() .split('\n'); const [N, K] = input[0].split(' ').map(Number); const MAX_SIZE = 1000..
[알고리즘 연습] 백준 10971 (외판원 순회 2, 자바스크립트)
·
알고리즘 연습
문제 10971번: 외판원 순회 2 첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 10) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j www.acmicpc.net 풀이 주어진 모든 노드를 출발 지점으로 선택하여 각각 dfs를 수행한다. 출발 지점으로 다시 돌아와야 하기 때문에 처음에 출발 지점은 방문 표시하지 않는다. 모든 도시를 방문했고 마지막 도시가 출발 지점이라면 최솟값을 갱신해준다. 소스 코드 const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt"; const input = requir..
[알고리즘 연습] 백준 1182 (부분수열의 합, 자바스크립트)
·
알고리즘 연습
문제 1182번: 부분수열의 합 첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다. www.acmicpc.net 소스 코드 const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt"; const input = require("fs") .readFileSync(filePath) .toString() .trim() .split("\n"); const [N, S] = input[0].split(" ").map(Number); const arr = input[1..
[알고리즘 연습] 백준 2503 (숫자 야구, 자바스크립트)
·
알고리즘 연습
문제 2503번: 숫자 야구 첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트 www.acmicpc.net 풀이 시간복잡도가 최악의 경우 약 9 * 9 * 9 * 100 * 3 * 3으로 충분히 완전 탐색으로 풀 수 있었다. 세자리 숫자 중 중복이 존재하는 경우에는 해당 숫자는 확인하지 않고 넘어갔다. 해당 문자의 스트라이크와 볼을 구하는 과정에서 indexOf를 사용했다. check 변수를 통해 모든 조건이 만족하는 경우에 answer 값을 +1 증가시켰다. 소스 코드 const filePath = process.platform === "linux" ? "/d..
[알고리즘 연습] 백준 13023 (ABCDE, 자바스크립트)
·
알고리즘 연습
문제 13023번: ABCDE 문제의 조건에 맞는 A, B, C, D, E가 존재하면 1을 없으면 0을 출력한다. www.acmicpc.net 소스 코드 const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt'; const input = require('fs') .readFileSync(filePath) .toString() .trim() .split('\n'); const [N, M] = input[0].split(' ').map(Number); const graph = []; for (let i = 0; i < N; i++) graph[i] = []; for (let i = 1; i = 5) { flag = true; r..
[알고리즘 연습] 백준 17626 (Four Squares, 자바스크립트)
·
알고리즘 연습
문제 17626번: Four Squares 라그랑주는 1770년에 모든 자연수는 넷 혹은 그 이하의 제곱수의 합으로 표현할 수 있다고 증명하였다. 어떤 자연수는 복수의 방법으로 표현된다. 예를 들면, 26은 52과 12의 합이다; 또한 42 + 32 + 1 www.acmicpc.net 소스 코드 const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt"; const input = require("fs") .readFileSync(filePath) .toString() .trim() .split("\n"); const n = +input[0]; const dp = new Array(n + 1).fill(0); dp[1] = 1;..
[알고리즘 연습] 백준 16937 (두 스티커, 자바스크립트)
·
알고리즘 연습
문제 16937번: 두 스티커 첫째 줄에 모눈종이의 크기 H, W, 둘째 줄에 스티커의 수 N이 주어진다. 다음 N개의 줄에는 스티커의 크기 Ri, Ci가 주어진다. www.acmicpc.net 풀이 전체 스티커의 갯수와 상관없이 2개의 스티커만 붙이면 되기 때문에 이중 for문을 사용했다. 두 스티커는 4가지 케이스로 붙여질 수 있다. (기본, 기본), (기본, 90도 회전), (90도 회전, 기본), (90도 회전, 90도 회전) 각 케이스마다 두 스티커를 가로와 세로 모두 연결할 수 있다. 가로로 연결한 경우 너비는 더하기가 되고 높이는 최댓값이 된다. 반면, 세로로 연결한 경우 너비는 최댓값이 되고 높이는 더하기가 된다. 소스 코드 const filePath = process.platform ==..
[알고리즘 연습] 백준 14501 (퇴사, 자바스크립트)
·
알고리즘 연습
문제 14501번: 퇴사 첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다. www.acmicpc.net 풀이 N의 최댓값이 15이기 때문에 조합 알고리즘을 활용해 구현했다. 마땅한 브레이크 포인트가 없기 때문에 dfs를 한 번 돌 때마다 계속 최댓값을 갱신한다. (N + 1까지 요일이 지나지 않는 경우가 존재) 선택한 상담의 T을 더해가며 dfs를 수행하고 지금까지 더해진 day를 다음 dfs의 시작점으로 지정한다. 이익을 구할 때는 정해진 기간 안에 진행할 수 있는 상담의 금액만 더한다. 소스 코드 const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt"; const input = require("fs") .read..