본문 바로가기

반응형

분류 전체보기

(369)
코딩테스트 문제 (25) - 텀 프로젝트 문제 1. p = [3,1,3,7,3,4,6], N = 7 => 3 2. p = [1,2,3,4,5,6,7,8], N = 8 => 0 풀이 입력을 통해 그래프를 구성하고 사이클에 속하지 않은 정점들의 개수를 출력하는 문제입니다. DFS를 통해 노드를 재귀적으로 방문하면서 리스트를 채워주고 이미 방문한 정점에 도달했을 때, 그 시작점부터의 리스트를 반환하면 사이클에 속한 정점을 구할 수 있습니다. 이를 전체 노드 수에서 빼주면 답을 구할 수 있습니다. kaggle.com의 notebook으로 작성한 풀이는 다음과 같습니다. 홍머스 정리 난이도: 중 DFS를 이용한 그래프 사이클 판별 참조 claude-u.tistory.com/435 www.acmicpc.net/problem/9466
코딩테스트 문제 (24) - 순열 사이클 문제 1. p = [3,2,7,8,1,4,5,6] => 3 2. p = [2,1,3,4,5,6,7,9,10,8] => 7 풀이 입력으로 들어온 순열로 그래프를 구성하고 그래프 내의 사이클의 개수를 출력하는 문제입니다. DFS를 통해 문제를 해결할 수 있습니다. 매 노드에 대해 DFS 함수를 호출하고 방문 노드를 기록합니다. 사이클이라면 DFS가 종료되고 방문하지 않은 다음 노드에 대해 DFS를 호출합니다. 호출한 DFS 횟수마다 카운트 하면 전체 사이클 개수를 얻을 수 있습니다. kaggle.com의 notebook으로 작성한 풀이는 다음과 같습니다. 홍머스 정리 난이도: 중 DFS, 사이클 판별 참조 www.acmicpc.net/problem/10451
코딩테스트 문제 (23) - 방향 그래프에서 사이클 찾기 방향 그래프에서 사이클이란 특정 정점에서 시작해 어떠한 경로를 지나 다시 그 정점으로 돌아오는 경로를 말합니다. 무방향 그래프에서는 서로소 집합으로 사이클을 판별할 수 있습니다. 반면, 방향 그래프에서는 어떻게 사이클이 있는지 판별할까요? DFS는 깊이우선탐색입니다. DFS를 이용해 그래프를 탐색하게 되면 해당 시작 정점에서 갈 수 있는 모든 정점을 방문한 뒤 종료됩니다. 이를 이용해 시작점과 방문점으로 이루어진 DFS 함수를 구성하여 시작점과 방문점이 같은 경우 사이클이 존재한다고 판단할 수 있습니다. 다음 그래프는 4,6,7 노드 간 사이클이 존재합니다. 이 그래프에 대해 사이클이 존재하는지에 대한 코드는 다음과 같습니다. 시간 복잡도 일단 DFS를 수행하는 것은 모든 정점을 방문하고 모든 간선을 방..
위상 정렬 (Topological Sort) 위상 정렬은 사이클이 없는 방향 그래프 (Directed Acyclic Graph, DAG) 에서 모든 노드를 방향성에 거스르지 않도록 순서대로 나열하는 정렬을 말합니다. 즉, 시작점이 존재하는 방향 그래프에서 순서를 거스르지 않고 정점을 나열하는 것입니다. 위상 정렬을 위해서는 진입차수 (In degree) 와 진출차수 (Out degree) 를 알아야 합니다. 그래프는 정점과 간선 정보로 존재하는데, 진입차수란 특정한 노드로 들어오는 간선의 개수, 진출차수는 특정한 노드에서 나가는 간선의 개수입니다. 위상 정렬은 진입차수가 0인 정점 (시작점)을 먼저 배치하고, 그 정점에서 나가는 간선들을 제거합니다. 그 후, 다음 진입차수가 0인 정점을 배치합니다. 위상 정렬은 큐나 스택을 이용해 구현할 수 있습니..
코딩테스트 문제 (22) - 랜선 자르기 문제 1. Ks = [802, 743, 457, 539], N = 11 => 200 풀이 K개의 랜선의 길이가 주어졌을 때, N개의 랜선을 만들 수 있는 가장 큰 랜선 자르는 길이를 구하는 문제입니다. 간단히 생각해보면 랜선을 자르기 위한 최대 길이는 배열 중 가장 긴 랜선이고 최소 길이는 1입니다. 즉, 1과 가장 긴 랜선 사이에 N을 만족하는 최대값을 구하면 되는 문제입니다. 이렇게 넓은 범위에서 특정 값을 찾는 문제는 이진 탐색 방법으로 풀 수 있습니다. Left, right를 양 끝으로 정하고 가운데를 탐색해서 그 가운데 값으로 랜선을 잘랐을 때 N보다 작으면 더 작은 값이 필요하니 right를 가운데로 옮기고 반대의 경우는 left를 가운데로 옮깁니다. Left를 가운데로 옮길 때 최대값을 계속..
자료구조 - 서로소 집합 서로소 집합은 데이터를 여러 가지 집합으로 분리하는 자료구조로 각 데이터를 같거나 다른 집합으로 분리하여 집합 관계를 표현합니다. 서로소 집합 자료구조는 X가 속한 집합과, Y가 속한 집합을 합치는 UNION(X, Y) 연산과 X가 속한 집합을 찾는 FIND(X) 연산으로 구성되어 있으며, UNION-FIND 자료구조라 부르기도 합니다. 각 집합은 루트 노드로 표현되며 UNION 연산은 각 데이터의 속한 집합이 다른 경우 합쳐주면서 루트 노드를 통일합니다. FIND 연산은 해당 데이터가 속한 집합의 루트 노드를 반환합니다. 여러 개의 합치기 연산이 주어졌을 때, 서로소 집합은 다음과 같이 동작합니다. X가 속한 집합의 루트 노드와, Y가 속한 집합의 루트 노드를 확인합니다. 같은 집합일 경우, 따로 합치..
DenseNet ResNet이 layer의 shortcut connection이 convolution layer의 깊은 적층을 가능하게 보인 이후, 각 layer를 shortcut으로 잇고자 하는 다양한 architecture들이 발표되었습니다. DenseNet은 2016년에 발표된 CNN architecture중 하나로 CNN의 반복된 각 layer를 dense하게 연결한 구조입니다. DenseNet은 다음 그림과 같이 이전 layer들의 feature map이 다음 layer의 입력으로 dense하게 연결하는 구조를 가지고 있습니다. 입력 layer의 feature map은 이후 모든 layer의 입력으로 연결되고 그 다음 layer의 feature mpa은 그 이후의 모든 layer의 입력으로 연결됩니다. 따라서 ..
코딩테스트 문제 (21) - 가장 긴 팰린드롬 부분문자열 문제 가장 긴 팰린드롬 부분문자열 (substring)을 출력하는 문제입니다. 1. 'babad' => 'aba' or 'bab' 2. 'cbbd' => 'bb' 풀이 생각해보면 가장 작은 팰린드롬은 2글자 아니면 3글자가 될 수 있습니다. 그렇다면 2칸, 3칸으로 이루어진 슬라이딩 윈도우를 구성하고 이를 왼쪽에서부터 이동시키면서 팰린드롬이면 양쪽의 칸을 한 칸씩 확장하여 팰린드롬인지 확인합니다. 확장한 후 팰린드롬을 확인할 때, 전체를 볼 필요 없이 양 끝값이 같으면 팰린드롬이라고 간단히 판단할 수 있습니다. 이런 방식으로 확장시키면서 팰린드롬일 경우 계속 저장해서 길이가 긴 문자열을 추출하면 되는 문제입니다. kaggle.com의 notebook으로 작성한 풀이는 다음과 같습니다. 홍머스 정리 난이도..

반응형