목록개발 (301)
GCP 버킷을 세팅하는 방법은 구글에 많이 나와 있으니, Nest.js 환경에서 GCP storage keyFile 을 활용하여 파일을 업로드 하는 방법을 다룬다.필요한 라이브러리yarn add multer @nestjs/platform-express @google-cloud/storageyarn add -D @types/multermulter // 파일 업로드 처리 미들웨어 라이브러리@nestjs/platform-express // nest.js 환경에서 express의 모든 기능을 사용하게 해주는 라이브러리 소스 코드 길이가 짧지 않으므로, 필요한 설명은 주석으로 대체한다. // file.controller.tsimport { Controller, Post, UploadedFiles, Us..
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("..