본문 바로가기

전체 글

백준 1071번 소트 http://icpc.me/1071 1071번: 소트 N개의 정수가 주어지면, 이것을 연속된 두 수가 연속된 값이 아니게 정렬(A[i] + 1 ≠ A[i+1])하는 프로그램을 작성하시오. 가능한 것이 여러 가지라면 사전순으로 가장 앞서는 것을 출력한다. www.acmicpc.net 풀이 간단한 그리디 문제입니다. 사전순으로 앞선 배열을 만들어야 하기 때문에 앞에서 최대한 작은 수를 사용해야 합니다. 앞서 $i$개의 수를 최적으로 출력했다고 가정할 때 가능하다면 무조건 출력하지 않은 수 중 최솟값을 출력해야 하며, 최솟값을 출력할 수 없다면 두 번째로 작은 값을 출력해야 합니다. 최솟값을 출력할 수 없는 경우는 두 가지입니다. 1) $i$번째로 출력한 수 + 1 == 최솟값일 때 2) 출력하지 않은 수에서.. 더보기
백준 20442번 ㅋㅋ루ㅋㅋ http://icpc.me/20442 20442번: ㅋㅋ루ㅋㅋ 어떤 문자열에서 몇 개의 문자를 지워서 부분 수열을 만들 수 있다. 예를 들어, ABC의 부분 수열은 ABC, AB, BC, AC, A, B, C와 빈 문자열이다. www.acmicpc.net 풀이 투 포인터를 이용하여 풀었습니다. 왼쪽에서 $i$번째 R을 기준으로 왼쪽에 있는 K의 수를 $lk[i]$, 오른쪽에 있는 K의 수를 $rk[i]$라고 하겠습니다. 이때 $l$번째 R부터 $r$번째 R까지 사용한 ㅋㅋ루ㅋㅋ문자열의 최대 길이는 $r - l + 1 + 2\times min(lk[l], rk[r])$이 됩니다. R은 $r - l + 1$개, K는 왼쪽 오른쪽 각각 $min(lk[l], rk[r])$개씩 사용할 수 있기 때문입니다. 단순히.. 더보기
플로이드-와샬 알고리즘 플로이드-와샬 알고리즘은 그래프에서 최단거리를 구하는 알고리즘 중 하나입니다. 플로이드 알고리즘, 플로이드-워셜 알고리즘 등으로 불리기도 합니다. 한 정점에서 다른 모든 정점으로 가는 최단 거리를 구하는 다른 최단거리 알고리즘과 다르게 모든 정점들 사이의 최단거리를 구할 수 있습니다. 정점의 수를 $V$라고 할 때 시간복잡도는 $O(V^3)$으로 꽤 높지만, 상수가 매우 작아 시간복잡도에 비해 빠르며 코드가 간단하다는 장점이 있어 모든 쌍 사이의 최단거리를 구하는 매우 효율적인 알고리즘입니다. 조금 응용하면 최단경로(최단거리인 경로에 속한 정점들) 또한 구할 수 있습니다. 편의를 위해 그래프의 정점의 개수를 $V$라고 부르겠습니다. 또한 이 글을 쉽게 읽으려면 그래프의 정점, 최단거리, 표현 방식 등 기.. 더보기
세그먼트 트리 소개 세그먼트 트리는 구간에 대한 연산을 $O(logN)$만에 처리할 수 있는 자료구조입니다. 난이도 높은 문제에서 다양한 방식으로 활용되는 자료구조이기도 합니다. 구조 이진 트리의 형태이며, 각 노드는 특정 구간의 값을 저장하고 있습니다. 이 값은 구간의 합, 최솟값 등 다양한 값이 될 수 있습니다. 루트 노드는 전체 구간에 대한 값을 저장하며, 루트 노드에서 멀어질수록 담당하는 구간이 작아지다 리프 노드에 도달하면 원소 하나만을 담당하게 됩니다. 연산 기본적으로 원소 하나를 변경하는 연산과 특정 구간의 값을 구하는 연산을 처리할 수 있습니다. 구간 합을 구하는 세그먼트 트리의 코드를 예시로 설명하겠습니다. 원소 변경 1 2 3 4 5 6 7 8 9 10 void change(int now, int l.. 더보기
유니온 파인드 트리(분리 집합) 소개 유니온 파인드 트리는 교집합이 없는 여러 집합들을 나타내는 자료구조입니다. 집합을 합치는 연산과 원소가 속해 있는 집합을 구하는 연산을 상수 시간에 처리할 수 있습니다. 구조 유니온 파인드 트리는 여러 개의 트리가 모여 있는 구조입니다. 각각의 트리는 집합 하나를 나타내며, 트리의 루트 노드의 번호가 해당 집합을 대표합니다. 배열에서 각 노드의 부모 노드 번호를 저장하고 있으며, 배열에서 재귀함수를 통해 부모 노드를 타고 올라가 루트 노드를 찾는 방식으로 구현합니다. 구현 i번 노드가 속해 있는 집합의 루트 노드를 구하는 find(i) 연산과 i, j번 노드가 속해 있는 두 집합을 합치는 union(i, j) 연산을 구현해야 합니다. find 연산 1 2 3 4 5 6 int par[100005];.. 더보기
트리 기초(의미, 구현, 용어, 종류) 지난 게시물에서 그래프에 대해 공부했습니다. 트리는 그래프의 특수한 형태입니다. 정말정말 다양하게 활용될 수 있는 재미있는 자료구조입니다. 트리란? 사이클이 없는 연결 그래프를 트리라고 부릅니다. 가중치와 방향 여부는 별로 중요하지 않습니다. 무슨 말인지 모르겠다면 지난 게시물을 참고하세요. 해당 형태의 그래프가 나무를 뒤집어 놓은 모양과 비슷해 트리라고 이름이 붙었다고 합니다. 트리의 용어 기본적으로는 그래프의 용어를 그대로 사용합니다. 보통 '정점' 대신 '노드'라는 용어를 많이 쓰는 것 같습니다. 루트 노드 : 트리의 맨 꼭대기에 위치할 정점을 이야기합니다. 임의로 설정할 수 있습니다. 부모/자식 노드 : 이웃한 두 정점 중 루트 노드와 더 가까운 정점이 부모, 다른 정점이 자식이 됩니다. 형제 노.. 더보기
그래프 기초(의미, 분류, 구현 방법) 기초소개 그래프는 자료구조의 일종으로, 배열과 달리 데이터간의 관계를 나타낼 수 있는 자료구조입니다. 형태에 따라 각기 다른 특성을 가지고 있기 때문에 여러 세부 분류로 나뉘기도 합니다. 그래프란? 데이터에 해당하는 정점과 정점을 이으며 정점끼리의 관계를 나타내는 간선으로 이루어진 자료구조입니다. 위 그림처럼 생긴 자료구조입니다. 이 그래프는 무엇을 나타내는 그래프일까요? 정점을 사람, 간선을 친구 관계로 표현한다면 집단에서 친구인 사람들을 표현하는 그래프가 됩니다. 정점을 도시, 간선을 길으로 생각한다면 지도처럼 도시 사이를 이동하는 경로를 표시하는 그래프가 됩니다. 이처럼 정점과 간선을 적절히 설정한다면 그래프가 많은 것들을 나타내도록 할 수 있습니다. 간선의 방향 방향은 일방 통행 도로처럼 간선에서.. 더보기
제 4회 천하제일 코딩대회 본선 후기 몇 시간 전(2020년 12월 22일 7시) 제 4회 천하제일 코딩대회가 끝났습니다. 2학년 선배 두 분과 팀을 이뤄 참여했고, 11문제 중 5문제를 풀고 전체 4위로 동상을 받았습니다. 원래 오프라인에서 진행되는 대회이지만 코로나19 상황이 악화되어 온라인으로 진행되었습니다. 팀원과는 디스코드로 소통했고, 부정행위 방지를 위해서인지 대회가 끝날 때까지 계속 캠을 켜고 화면도 공유해야 했습니다. 오프라인 행사를 기대했던 저는 아쉬움이 남았지만, 현재 상황에서 취할 수 있는 최선의 방법이었다고 생각합니다. 시작이 10분 연기되었던 점만 빼면 대회는 전반적으로 원활하게 진행되었습니다. 처음에 디스코드 방으로 들어가니 딜레이가 너무 심하고, 마이크도 잘 되지 않는 것 같아 당황했습니다. 다행히 시간이 지나자 .. 더보기