본문 바로가기

코딩 테스트 풀이

(35)
[LV3] 섬 연결하기 문제 풀이항목이 '탐욕법'으로 되어 있어서, 처음에는 dfs를 통해 모든 경로를 다 탐색한 후 그 중 최소 거리를 찾으려 했다.하지만 개같이 실패에 시간초과까지,..,.,,결국 다른 방법을 사용해 보기로 했다. 내가 찾아본 방법은 '크루스칼 알고리즘'으로, 모든 정점을 연결 할 때, 최소의 비용을 찾는 알고리즘이라고 한다.정확히 이 문제를 풀기에 적합한 알고리즘으로, 각 정점과 가중치가 주어졌을 때, 현재 정점이 연결 되어 있는지 아닌지를 파악하여 연결 되어있다면 패스, 안되어 있다면 가중치를 더하는 방식을 사용한다.  위와 같은 그래프의 각 정점을 모두 이었을 때, 최소 가중치를 구하는 방법을 알아보자먼저 가중치의 오름차순으로 정렬해 준다. 그 다음, 각 연결별로 순회하며 노드의 부모 노드들을 비교해 ..
[C4] 1991 - 트리 순회하기 문제 트리가 주어지고, 이 트리를 각각 전위, 중위, 후위 순회 하는 문제였다.트리 구조를 만드는 것 자체는 쉽지만, 이 트리를 탐색하는 방법을 생각하는 것이 조금 어려웠던 문제였다.나는 실제 그래프 모양대로 배열을 만들어가며 문제를 풀었다. 풀이1. 전위 순회전위 순회는 루트 -> 왼쪽 자식 -> 오른쪽 자식의 순서대로 순회하는 방법이다.각 계층별로 루트를 먼저 돌기 때문에, 루트를 먼저 체크하고 왼쪽 루트로 내려간다.다음 계층에서도 왼쪽 루트를 돌고, 만약 더이상 왼쪽 루트가 없다면 오른쪽 루트를 돈다.오른쪽 루트도 없다면 다시 한층 위로 올라가 오른쪽 루트가 있는지 확인한다.다시 A 노드로 돌아갔다면, 오른쪽 노드를 똑같은 방식으로 탐색하면 된다.  전위 순회는 깊이 우선 탐색, 즉 'DFS'와 똑..
[C4] 11725 - 트리의 부모찾기 문제 풀이보통은 트리 구조를 만들거나, 자식 트리를 찾는 문제가 많은데 이번에는 부모 트리를 찾는 문제가 나왔다.나는 최상위 노드부터 한단계씩 아래로 내려가는 방법을 사용하기 위해  bfs를 이용했다.각 노드별로 탐색하며, 현재 탐색하는 노드에 자식 노드가 있다면, 그 자식 노드의 부모 노드로 현재 노드를 추가해주는 방법을 사용하기로 했다. 먼저 그래프 구조를 만들어 준다.const graph = {};input.forEach(([s, e]) => { if (!graph[s]) graph[s] = []; if (!graph[e]) graph[e] = []; graph[s].push(e); graph[e].push(s);}); 그래프 구조를 만들면, 한 노드에 연결된 노드들이 어떤 것이 있는지 알 ..
[C3] 5430 - AC 문제세상에 할 일이 없어서 새로운 언어를 만드는 사람이 어딨나,,,,,,, 풀이사실, 처음 봤을 때는 R은 뒤집기, D는 삭제라 하니...당연히 reverse()와 shift()를 쓰면 되는거 아닌가? 라고 생각했지만그렇게 당연하게 풀리는 문제가 골드5일리가 없다..!!!!의심하고 또 의심하며 처음부터 다른 풀이 방법을 사용해 보기로 했다. 우선, 테스트케이스가 최대 100개, 주어지는 함수의 개수가 최대 10만개, 배열의 요소가 최대 10만개이다.reverse()의 시간 복잡도는 O(n)이므로, 최악의 경우 복잡도는 O(n^2).그러므로 최대한 메서드를 쓰지 않고, 1차원 for문 안에서 해결하는 것을 목표로 했다. 내가 생각했던 방법은 투포인터?와 비슷한 방법으로, 시작 인덱스와 끝 인덱스를 정해놓고..
[C4] 1149 - RGB거리 문제풀이DP를 이용해 직전 집을 칠하는 데 드는 비용의 최솟값으로부터 현재 집을 칠하는데 필요한 비용을 계산한다.예를 들어 직전 집을 칠하는데 각각 100, 200, 300원이 들었고, 지금 집을 빨간색으로 칠하는데 50원이 든다면직전 집들을 칠하는 비용 + 지금 집을 빨간색으로 칠하는데 드는 비용을 비교해서 집을 빨간색으로 칠하는데 드는 최소 비용을 찾아준다.위 예시에서는 150, 250, 350중 최솟값인 150원이 이 집을 빨간색으로 칠하는데 드는 비용이다.이 조건만 보면 간단한 dp로 해결 할 수 있다. 하지만 주의해야 할 것은 직전 집과 같은 색상으로는 칠할 수 없다는 조건이 붙어있다. 이전 집을 빨간색으로 칠했다면, 다음 집은 빨간색이 아니라 초록색 또는 파란색으로밖에 칠할 수 없다는 것이다...
[C3] 1260 - DFS와 BFS 문제풀이DFS는 재귀로, BFS는 큐를 이용해서 풀었다.먼저 노드 정보를 이용해 그래프를 만들어준다.그래프는 객체로 만들어도 되고, 이차원 배열로 만들어도 되는데 나는 일단 이차원 배열을 사용하고 있다.노드가 n개, 간선이 m개이므로 그래프는 n개의 요소를 가진 이차원 배열이고, n번 노드와 연결된 노드들을 n-1번 배열에 넣어주면 된다.편의를 위해 n이 아니라 n+1개의 배열을 만들어주고, 0번 배열은 비워 1번부터 시작하도록 해주면 좋다노드연결된 노드0-12, 321, 431, 441,2,3 const graph = Array.from({ length: n + 1 }, () => []); input.forEach((el) => { const [s, e] = el; graph[s].push..
[C3] 9375 - 패션왕 신해빈 문제 여러 종류의 의상을 매치 시키는 문제이다약 8개월 전에 풀었던 프로그래머스의 '의상' 문제와 동일한 문제.https://kinggh.tistory.com/98 240320 의상문제 설명 코니는 매일 다른 옷을 조합하여 입는것을 좋아합니다. 예를 들어 코니가 가진 옷이 아래와 같고, 오늘 코니가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추kinggh.tistory.com 당시에는 그냥 풀이를 보고 이해 없이 풀었는데, 이 문제를 다시 풀며 완벽히 이해할 수 있었다.풀이입력이 까다로워서, 입력을 제외하고 첫번째 TC만 보자headgear에 hat, turban이 있고eyeware에 sunglasses가 있다.각 종류별 2개, 1개의 의상이 있기 때문에각 의상들을 매치하는 경우..
[C3] 14940 - 쉬운 최단거리 문제 풀이각 점들이 시작 지점으로부터 얼마나 떨어져 있는지를 나타내는 문제이다.시작 지점(2)가 무조건 [0,0]이 아니기 때문에, 상하좌우 사방으로 움직여가며 거리를 찾고, 0으로 되어 있는 부분은 이동 할 수 없으므로 패스한다.당연스럽게 BFS를 사용해 문제를 풀었다.문제의 조건 중에 '원래 0이었던 부분'은 0으로, 탐색 할 수 없는 부분은 -1로 나타내 주라고 했기 때문에시작 지점으로부터 떨어진 거리를 표기할 새로운 지도를 만들되 모든 원소를 -1로 설정하고, 기존 지도와 비교해서 0인 부분은 0으로 바꿔준다.이후 BFS 로직을 통해 0이 아닌 위치는 거리로 바꿔주면 이동하지 않은 곳은 -1로 그대로 남게 된다. 코드const readline = require("readline");const rl..