목록개발/algorithm (175)
https://school.programmers.co.kr/learn/courses/30/lessons/77486 문제 지문이 굉장히 긴 편이기에, 문제의 일부만 대체 후 설명한다. 문제는, 각 판매원의 이름을 담은 배열 enroll, 각 판매원을 다단계 조직에 참여시킨 다른 판매원의 이름을 담은 배열 referral, 판매량 집계 데이터의 판매원 이름을 나열한 배열 seller, 판매량 집계 데이터의 판매 수량을 나열한 배열 amount가 매개변수로 주어진다. 여기서 중요한 규칙이 있는데, 만약 판매자가 a금액 만큼 판매한 경우, 해당 금액의 10%를 자신을 다단계에 참여시킨 판매원에게 지급하며 남은 90%의 금액을 자신이 갖게 된다. (이때, 10%의 금액을 받은 판매원 역시 해당 금액의 10%를 자..
https://www.acmicpc.net/problem/6550 문제는 a,b 두 문자열이 주어졌을 때, b에서 몇 개의 문자를 제거한 뒤 순서를 바꾸지 않고 합쳤을 경우, a가 b의 부분 문자열이 되는지 출력하는 문제다. 문제 풀이 방식 a,b 문자열이 존재할 때, 두 개의 포인터를 두어 새로운 문자열을 만든 뒤, 해당 문자열이 짧은 문자열인 a와 일치하는지 확인한 뒤 결과를 리턴하도록 했다. const fs = require("fs"); const input = fs .readFileSync(process.platform === "linux" ? "/dev/stdin" : "입력.txt") .toString() .trim() .split("\n"); function solution(data) { c..
https://www.acmicpc.net/problem/1308 자바스크립트로 해결된 포스팅이 없어 포스팅하게 됨. 문제 풀이 방식 시작 날짜의 총 날짜와, 끝 날짜의 총 날짜를 깡으로 구해서 그 차이를 출력하는 방식으로 접근하였다. 문제에서 말하는 윤년 기준을 적용하는 방식이 은근히 까다로웠던 문제. 전체 소스 코드 const fs = require("fs"); const input = fs .readFileSync(process.platform === "linux" ? "/dev/stdin" : "입력.txt") .toString() .trim() .split("\n"); function solution(data) { const [[sy, sm, sd], [ey, em, ed]] = data.map..
https://www.acmicpc.net/problem/2891 문제 해결 방식 각 팀마다 보유한 카약의 갯수를 먼저 저장해두었다. 이후 상황에 따라 최선의 선택을 하는 탐욕법으로 접근하였는데, 기초 논리는 다음과 같다. 만약 자신의 보유한 카약의 갯수가 2로 부족한 팀에게 배를 줄 수 있으며 이웃된 팀 모두 배가 필요하다면, 자신의 앞번호부터 배를 주는 방식으로 선택했다. 이와 같은 방법을 통해, 문제에서 제시된 '다른 팀에서 받은 카약을 다른 팀에 빌려줄 수 없다'를 만족할 뿐더러, 출발하지 못하는 팀 역시 최소화할 수 있다. 전체 소스 코드 const fs = require("fs"); const input = fs .readFileSync(process.platform === "linux" ? ..
https://www.acmicpc.net/problem/12847 문제 풀이 방식 n의 최댓값이 10만 이하이기 때문에, 최소한의 시간 복잡도로 해결할 수 있는 방식으로 접근했다. 문제 해결 방식은 단순하다. 우리에게 5일의 시간이 주어지고, 2일 간 일을 할 수 있다고 할 때, 미리 처음에서부터 2일차까지의 수익을 구한 뒤, 이 값에서부터 i일차의 수익은 가산, i-2일차의 수익은 감산해가며 전체 값을 갱신하고 이 해당값이 최댓값이라면 최댓값으로 갱신하는 것을 반복하며 최댓값을 구할 수 있었다. 전체 소스 코드 const fs = require("fs"); const input = fs .readFileSync(process.platform === "linux" ? "/dev/stdin" : "입력...
https://school.programmers.co.kr/learn/courses/30/lessons/132266 해당 문제는 총 지역 수, 왕복 가능한 두 지역을 원소로 하는 배열, 각 부대원들이 위치한 지역, 목적지가 주어질 때, 각 부대원들이 부대로 도착할 수 있는 최소시간을 출력해야 하는 문제다. 문제 풀이 방식 출발지에서 목적지까지 도착이 가능한지 확인하는 방법도 있겠으나, 반대로 목적지에서부터 출발지에 도착할 수 있는지 기록하는 것이 메모리나 시간 측면에서 유리할 것이라 판단하여 이를 바탕으로 로직을 작성하였다. function solution(n, roads, sources, destination) { const distances = Array.from({ length: n + 1 }, (..
https://www.acmicpc.net/problem/2635 문제는 해당 규칙에 따라 만들 수 있는 수열의 최대 길이와, 최대 길이를 이루는 수들을 출력하는 문제다. 문제 해결 방식 수의 범위가 3만 이하로 작은 편이고, 만들어지는 수열 역시 길이가 크게 길지 않을 것이라 판단하여 모든 경우의 수를 탐색하는 완전 탐색으로 접근했다. N이 주어질 경우, 1부터 N까지 모든 경우를 대입하여 문제 요구에 따라 가장 길이가 길게 만들어지는 로직을 구현하면 된다. const fs = require("fs"); const input = fs .readFileSync(process.platform === "linux" ? "/dev/stdin" : "입력.txt") .toString() .trim() .spli..
https://www.acmicpc.net/problem/14888 해당 문제에서는 연산을 통해 최댓값, 최솟값을 만들 수와 연산자의 갯수가 각각 주어지고, 해당 요소들을 통해 만들 수 있는 최댓값, 최솟값을 출력하면 된다. 문제 풀이 방식 최대, 최솟값을 구하기 위해 백트래킹 알고리즘으로 접근했다. 연산의 사용할 수를 numbers 배열, 연산자들의 갯수를 opts로 초기화한 뒤, 백트래킹 로직을 작성했다. 백트래킹 함수는 현재값, 깊이, 연산자들의 갯수를 인자로 하며, 해당 '깊이'가 글자수와 같을 때 (즉 모든 연산을 완료했을 때) 결괏값에 저장토록 했다. 함수 내부에서는 각 연산자마다 if문을 활용하여 각각의 로직을 작성할 수 있었지만, 개인적으로 좋아하지 않는 방식이기 때문에, 각 연산자마다의 ..