목록개발/algorithm (175)
https://www.acmicpc.net/problem/1940 위에서 주어진 예제를 예를 들면, 해당 문제는 수들 [2,7,4,1,5,3]을 조합하여 9를 만드는 방법은 몇 가지가 있는지 출력하는 문제다. 이 경우, 정렬을 한 뒤 맨 앞의 값과 맨 뒤의 값을 합한 뒤, 우리가 원하는 값과 같은지 비교해가며 풀이하면 된다. 예를 들어, 주어진 수 [2,7,4,1,5,3]을 정렬한다. 이후 [1,2,3,4,5,7]로 정렬된 값에서 맨 앞수 '1'과 맨 뒷수'7'을 합하여 '9'와 비교한다. 이때 합쳐진 수 '8'는 '9'보다 작기 때문에, 앞에 있는 수 '1'은 제거한다. ('1'은 가장 큰 수 '7'과 합쳐도 원하는 수를 만들 수 없기 때문에 필요 없음) 만약 합친 수가 더 크면 큰 수를 제거, 동일하..
https://www.acmicpc.net/problem/2985 이 문제는 주어진 세 가지 수와, 사칙연산 기호 네 개 중 하나, 등호를 하나써서 만들 수 있는 올바른 등식을 출력하는 문제다. 따라서, 총 8번의 조건 분기가 필요하고, if문 또한 8번 사용해야 한다. 하지만 많은 if문을 사용하는 것을 싫어하는 나로서는 예전 포스팅에서 객체에 함수를 저장해 조건을 나누고 문제를 해결했던 것처럼, 이번에는 배열에 함수를 넣어 문제를 해결했다. 2023.09.11 - [개발/algorithm] - 백준 11586 - 지영 공주님의 마법 거울 (객체에 함수 저장) JS 소스 코드 const fs = require('fs') const input = fs.readFileSync(process.platform..
https://www.acmicpc.net/problem/1065 해당 문제는 문제에서 제시한 것처럼 '한수'의 갯수를 출력하는 문제다. 여기서 답에 대한 힌트는 예제에서 주어지는데, 100~110까지의 각 자릿수가 등차수열을 이루는 수는 존재하지 않으므로 100 미만의 모든 수는 한수라고 볼 수 있다. 그러므로 100 미만인 n이 주어진 경우 그대로 출력하고, 100 이상인 n이 주어지는 경우, 100부터 n까지의 한수의 수와 99(100 이하의 한수는 99개이므로) 합하여 출력하면 된다. const fs = require('fs') const input = fs.readFileSync(process.platform === "linux" ? "/dev/stdin":"입력.txt") .toString()..
https://www.acmicpc.net/problem/1149 문제를 간단히하면 옆에 있는 집과 색이 같지 않게끔 하면서 색을 칠했을 때의 최소비용을 구하는 문제다. 이 문제는 다이나믹 프로그래밍을 통해 해결할 수 있는데, 아래 표로 이해를 도우려한다. 먼저 위의 예제를 빌려, 1번째 집이 각각의 색으로 색칠할 때의 비용과 2번째 집을 붉은 색으로 칠할 때의 비용만 주어진다고 가정하자. Red Green Blue 1 26 40 83 2 49 (채택) - - 이때의 2번집을 붉은 색으로 칠할 때의 최소비용은 89이 된다. (옆집과 같은 색은 사용할 수 없고, 남은 녹색과 푸른색 중 더 값싼 녹색을 선택해야 하기 때문.) Red Green Blue 1 - (동일한 색 선택 불가) 40 (최솟값) 83 2..
https://www.acmicpc.net/problem/14501 문제는 '퇴사 전'까지 가장 많은 수익을 얻는 경우의 수익을 구하는 문제다. 상담마다 필요한 '기간'이 주어지기 때문에 모든 상담을 진행할 수 없는데, 이 때 모든 경우의 수를 직접 구할 수 없으므로 DP를 통해 해결한다. 위 문제에서 주어진 예시로 설명을 하자면, 접근 방식은 다음과 같다. 1일차에 상담을 진행했다고 한다면(소요기간 3일 / 수익 10), 소요기간이 3일이기 때문에 2-3일은 다른 사람과의 상담이 불가능하고, 나머지 일자에는 1일차에 상담을 진행한 경우의 아래와 같이 수익을 남게 한다. (4,5,6,7일차에 상담을 한다면, 1일차의 수익까지 가져갈 수 있기 때문) 1일 2일 3일 4일 5일 6일 7일 10 0(상담 X)..
https://www.acmicpc.net/problem/1158 해당 문제는 특정 번째 사람을 제거하는 식으로 진행되므로, 선입선출 방식을 적용할 수 있는 queue 자료 구조로 문제를 해결하면 된다. 이 문제의 풀이는 배열로 queue를 구현하여 적용했다. const fs = require('fs') const input = fs.readFileSync(process.platform === "linux" ? "/dev/stdin":"입력.txt") .toString().trim() function solution(data) { const [N,K] = data.split(' ').map(Number) const queue = Array.from({length : N}, (_,idx)=> idx + 1..
https://www.acmicpc.net/problem/2292 해당 문제는 반복문을 통해 문제를 해결하려고 하면 시간 초과가 나게 되므로 규칙성을 찾아 해결해야 한다. 중심을 시작으로 각 거리마다 가장 큰 값이 [1, 7, 19, 37, 61]인 것을 보아, 6n[6, 12, 18, 24...]씩 증가하고 있음을 확인할 수 있으므로 이를 활용해 문제를 해결하면 된다. const fs = require('fs') const input = fs.readFileSync(process.platform === "linux" ? "/dev/stdin":"입력.txt") .toString().trim() function solution(data) { // sum 의 초깃값이 1인 이유는, 벌집 가장 가운데 있는 ..
https://www.acmicpc.net/problem/9324 해당 문제는 주어진 텍스트가 조건에 맞는지 판별하는 문제다. 문제 설명이 조금 미흡한데, '각 문자가 세 번째 등장할 때'가 아니라 '각 문자가 3의 배수로 등장할 때마다'를 적용하고 풀어야 문제가 해결된다. 문제를 해결한 방식은 다음과 같다. 예제로 주어진 문자열인 'AABA'를 예시를 들면, 조건에 맞게끔 'AABAA'를 만든 뒤 비교해주고 두 문자열이 일치하면 OK, 그렇지 않을 시 FAKE를 반환하도록 했다. 이는 구현이 간단한 편인데, 먼저 각 문자가 등장한 횟수를 담을 객체, 비교를 위한 문자열 변수를 하나 선언한다. 이후 각 문자가 등장할 때마다 해당 객체에 추가한다. 반복문을 진행하며 만약 해당 문자열 등장 횟수가 3의 배수..