목록개발/algorithm (175)
https://www.acmicpc.net/problem/21938 문제 풀이 방식 먼저 픽셀 값에 따른 물체의 유무를 저장하기 위한 이차원 배열을 만들었다. 이후 반복문으로 순회하며 rgb값의 평균값을 구하고 해당 값이 경계값을 넘는다면, 이차원 배열의 해당 위치를 'true'로 설정하여 물체가 있음을 저장하였다. 다음으로는 너비우선탐색 알고리즘을 활용하여, 분리된 '물체'가 총 몇개인지 누산하는 방식으로 문제를 해결하였다. 전체 소스 코드 const fs = require("fs"); const input = fs .readFileSync(process.platform === "linux" ? "/dev/stdin" : "입력.txt") .toString() .trim() .split("\n"); f..
https://www.acmicpc.net/problem/9047 문제 해결 방식 문제 해결 아이디어는 문제에서 제시된대로 구현하면 되는 문제라 크게 어렵지 않다. 다만, 내림차순 정렬과 오름차순 정렬의 차이를 구한 뒤, 해당 값이 4자릿수가 아닌 경우가 나타날 수 있고 이 부분에 대한 에러처리가 온전히 되지 않으면, 시간 초과로 오답을 받을 수 있다. (예를 들어, 초깃값이 1000 인 경우, 1000 => 999(1000 - 1) 이므로, 이 경우엔 '0999'로 수정해야 한다는 것.) 전체 소스 코드 const fs = require("fs"); const input = fs .readFileSync(process.platform === "linux" ? "/dev/stdin" : "입력.txt")..
https://www.acmicpc.net/problem/16139 문제 해결 방식 해당 문제의 경우는, 특정 질문에서 a~b 구간의 특정 알파벳 등장 횟수를 출력하는 문제다. 이때, a~b 구간에서 등장한 모든 알파벳의 갯수를 매 쿼리마다 구하는 것은 시간 복잡도에서 불리하다. 따라서 문자열 길이에 맞는 테이블을 구현 후, 각 인덱스마다 특정 알파벳이 몇번 등장했는지 기록하는 자료 구조를 구현했다. 이를 활용할 경우, b 인덱스까지 등장한 알파벳의 갯수와 a 인덱스까지 등장한 알파벳의 갯수의 차가 곧 우리가 구해야 할 값이 된다. 전체 소스 코드 const fs = require("fs"); const input = fs .readFileSync(process.platform === "linux" ? ..
https://www.acmicpc.net/problem/2668 문제 풀이 방식 먼저 각 노드 별로 어떤 노드와 연결되어 있는지 객체 테이블에 저장해두는 것이 시작. 다음 문제를 푸는 것에 있어, 시작 노드에서 출발해 연결된 노드를 순회할 때 시작 노드에 도달할 수 있는지가 중요했다. 따라서, 깊이우선탐색(재귀로 접근)으로 탐색하는 과정에 있어, 시작점을 기억하기 위해, 시작점을 재귀함수에 전달인자로 전달할 필요가 있었다. (물론 전역 변수로 저장해도 상관 없다.) 재귀 함수는 다음과 같이 구현했다. 다음 노드를 방문한 적이 있는지 확인했고, 방문한 적이 없다면 다시 재귀 함수로 진입. 만약 다음 노드가 방문한 적이 있고 시작점과 같다면, 이를 결괏값에 추가시켰다. (만약 위 두 조건을 만족하지 못할 ..
https://www.acmicpc.net/problem/21316 문제 해결 방식 별 'Spica'와 연결된 노드는 총 3개며, 연결된 각 노드는 1, 2, 3개의 노드와 연결되어 있다는 특징을 발견하면 어렵지 않은 문제. 그리고 이와 같은 특징은 spica가 유일하기에, 위 조건을 만족하는 노드를 답으로 출력하였다. (문제에서는 6번 노드가 1개와 연결 | 8번 노드가 2개와 연결 | 3번 노드가 3개와 연결되어 있다.) 전체 소스 코드 const fs = require("fs"); const input = fs .readFileSync(process.platform === "linux" ? "/dev/stdin" : "입력.txt") .toString() .trim() .split("\n"); fu..
https://www.acmicpc.net/problem/18111 문제 해결 방식 문제에서 중요한 힌트는 땅의 높낮이는 256 이하라는 것에서 착안해, 0부터 256까지의 자연수 x를 대입했을 때의 '걸리는 시간'을 모두 구하는 식으로 접근했다. (여기서, 박스의 갯수도 체크해야 하는데, 해당 자연수 x로 모든 땅을 고르게 만들 때의 박스가 부족한 경우는 Infinity 를 반환토록 하여 정답에서 배제하였다.) 이후, 256개의 원소를 담을 수 있는 공간에 해당 값들을 저장한 뒤, 가장 시간이 짧게 걸린 값을 찾았다. (이때, 최소 '걸리는 시간'이 같은 경우가 있을 때는, 가장 땅 높이가 높은 값을 추출해야 하므로, lastIndexOf 메서드를 활용하였다.) 전체 소스 코드 const fs = re..
https://www.acmicpc.net/problem/17087 문제 해결 방식 수빈이가 자신의 위치 기준, +D 혹은 -D로만 이동할 수 있다는 점에서 해결 방식을 찾았다. 만약 수빈이의 위치가 0, 동생들의 위치가 [2,8]라면 2 * 1 로 2로 이동, 2 *4 로 8로 이동할 수 있기 때문에 이때 2는 모든 동생을 찾을 수 있는 값이 된다. 그리고 이 값은 2와 8의 최대공약수. 따라서, 수빈이 위치를 기준으로 동생들의 거리를 구한 뒤 동생들의 거리의 최대공약수를 구하면 된다. 이때 이 최대공약수를 구하는 알고리즘은 유클리드 호제법을 활용하면 되는데, 유클리드 호제법이란 두 개의 정수를 나누어가며 최대공약수를 찾는 방식이라고 말할 수 있다. 전체 소스 코드 const fs = require("..
https://www.acmicpc.net/problem/5637 해당 문제는 전체 텍스트에서 가장 긴 단어를 소문자로 출력하는 문제다. 다만, 단어는 영문과 하이픈으로만 구성된 단어로만 친다. 문제 해결 방식 먼저 각 문자별로 나누는 과정이 필요했는데, 이때 flat 메서드로 2차원 배열의 문자열을 병합했다. 이후 각 문자열마다 영문, 하이픈만을 추출하는 방식은 정규표현식을 적용하였다. (해당 정규표현식은 gpt를 활용) 그리고 문자열 순회마다 해당 문자열의 길이가 최댓값보다 큰지 확인한 뒤, 크다면 가장 큰 값을 갱신하는 방식으로 로직을 마무리지었다. 전체 소스 코드 const fs = require("fs"); const input = fs .readFileSync(process.platform =..