목록개발 (301)
https://www.acmicpc.net/problem/3182 문제 풀이 방식 깊이 우선 탐색인 DFS 알고리즘을 활용하여, 각 노드에 방문할 때 깊이를 누적하여 반환하고 저장한 뒤, 저장된 데이터에서 가장 높은 값을 가진 인덱스를 답안으로 출력했다. 전체 소스 코드 const fs = require("fs"); const input = fs .readFileSync(process.platform === "linux" ? "/dev/stdin" : "입력.txt") .toString() .trim() .split("\n"); function solution(data) { const arr = data.map(Number); const N = arr[0]; let visited = Array.from(..
https://www.acmicpc.net/problem/1051 문제는 다음과 같이, 꼭짓점에 쓰여있는 수가 모두 같은 가장 큰 정사각형을 찾는 문제다. 문제 풀이 방식 사각형의 크기를 의미하는 첫 줄에 주어진 데이터 N,M이 모두 50으로 작은 편이기에, 가능한 모든 상황을 탐색하는 완전탐색으로 접근했다. 각 좌표마다 가능한 크기만큼의 꼭짓점의 수를 구하고, 만약 모두 일치한다면 결괏값을 수정해주는 방식으로 로직을 구현했다. 전체 소스 코드 const fs = require("fs"); const input = fs .readFileSync(process.platform === "linux" ? "/dev/stdin" : "입력.txt") .toString() .trim() .split("\n"); ..
https://www.acmicpc.net/problem/4673 문제는 문제에서 말하는 셀프넘버를 모두 구하는 문제다. 문제 해결 방식 문제에서 말하는 셀프 넘버인 수를 직접 구하기는 어렵단 생각이 들어, 셀프 넘버가 아닌 수를 먼저 모두 찾은 뒤, 전체 10000 이하의 자연수에서 셀프 넘버가 아닌 수를 제외하는 방식으로 로직을 구현했다. const table = {}; for (let i = 1; i
https://www.acmicpc.net/problem/17352 문제는 섬의 갯수 N과 각 섬끼리의 간선들이 주어질 때, '두 섬'을 연결하는 것만으로 모든 섬을 연결할 수 있는 '두 섬'을 찾아 하나만 출력하는 문제다. 문제 풀이 방식 집합을 효율적으로 관리하기 위해 find-union 알고리즘을 활용했다. 먼저 주어진 간선들을 사용하여 각 집합을 구분한 뒤, 반복문을 통해 두 섬이 속한 집합이 다른 경우 해당 두 섬 번호를 출력하고 종료시키는 방식으로 로직을 구현했다. const fs = require("fs"); const input = fs .readFileSync(process.platform === "linux" ? "/dev/stdin" : "입력.txt") .toString() .tri..
https://school.programmers.co.kr/learn/courses/30/lessons/169199 해당 문제는 너비우선탐색 알고리즘인 BFS에 대한 이해가 되어 있다면 시간을 들여 충분히 해결할 수 있는 문제다. 타 BFS 알고리즘 문제와 달리, 다음 경로가 '게임판 위의 장애물이나 맨 끝에 부딪힐 때까지 이동'한다는 점만 주의하면 된다. 문제 풀이 방식은 다음과 같다. - 주어진 board 에서 시작지점과 도착지점을 찾는다. - BFS 알고리즘 구현하되, 이때 이동하는 방향에 따라 미끄러져 이동했을 때 도달할 수 있는 다음 위치를 반환하는 함수를 구현한다. 전체 소스 코드 function solution(board) { const Y = board.length, X = board[0]..
https://www.acmicpc.net/problem/2578 문제는 데이터로 빙고판에 써져 있는 수와 사회자가 부르는 수가 주어질 때, 사회자가 몇 번째 수를 부를 때 빙고가 3개 이상이 되는지 묻는다. 문제 풀이 방식 문제는 단순하게 접근했다. 먼저 빙고판에 적혀 있는 숫자들의 좌표를 저장하는 테이블을 만들고, 해당 숫자가 불렸는지 확인할 2차원 배열을 만들었다. (기본값은 false) 이후 사회자가 숫자를 부를 때마다, 테이블에 저장되어 있는 해당 숫자의 좌표에 맞게 2차원 배열의 해당 좌표 위치를 true로 수정했다. 그리고 이때마다 빙고가 3개 이상인지 검증하여 빙고가 3개 이상일 경우 정답을 출력토록 했다. 전체 소스 코드 const fs = require("fs"); const input..
https://www.acmicpc.net/problem/20364 문제 해결 방식 각 정점의 부모는 정점 번호 // 2 (2로 나눈 뒤 소숫점 버림)이라는 규칙을 가지고 있기 때문에, 해당 정점에서 위로 올라가는 식으로 로직을 구현했다. 이때, 만약 방문하는 정점이 누군가가 이미 위치한 땅이라면 해당 땅 번호를 리턴하고, 최정점 루트인 1에 도달할 때까지 누군가 선점한 땅을 마주치지 않는다면, 해당 정점을 기록하고 0을 리턴하도록 했다. 전체 소스 코드 import sys data_temp = sys.stdin if sys.platform == 'linux' else open('입력.txt', 'r') input_data = data_temp.read().splitlines() def solution..
https://www.acmicpc.net/problem/10844 문제는 문제에서 제시된 것처럼 모든 자리의 차이가 1인 계단수의 갯수를 출력하는 문제다. 문제 풀이 방식 1 ~ 8까지의 수는 각각 2개의 수 (예를 들어 1의 경우 0과 2가 다음에 올 수 있는 계단수)를 가진다고 할 때, 0과 9는 각각 1과 8밖에 계단수를 갖지 못한다는 점으로 점화식을 수립하여 로직을 구현했다. 단 1의 자리 수의 경우는 먼저 0이 올 수 없으므로 이 점만 유의하면 된다. import sys data_temp = sys.stdin if sys.platform == 'linux' else open('입력.txt', 'r') input_data = data_temp.read().splitlines() def solut..