본문 바로가기

알고리즘

(43)
백준 알고리즘 중급 - BFS (연습) - 1 점점 업로드 주기가 길어진다.. 좀 게을러진 것 같아 반성이 된다. 좀 더 마음을 다잡고 다시 해보자. 중요한 건 속도가 아니고 방향이니, 너무 성급해하지는 말고. 어쩌라는겨 아무튼 정리 시작! - * 뱀과 사다리 게임 (mid) : 변칙 조건이 주어진 보드판에서 도착점에 도달하는 최소 주사위 굴리기 횟수를 구하는 문제. 16928번: 뱀과 사다리 게임 첫째 줄에 게임판에 있는 사다리의 수 N(1 ≤ N ≤ 15)과 뱀의 수 M(1 ≤ M ≤ 15)이 주어진다. 둘째 줄부터 N개의 줄에는 사다리의 정보를 의미하는 x, y (x < y)가 주어진다. x번 칸에 도착하면, y번 칸으 www.acmicpc.net - 뱀이 있는 칸에 가면 뒤로 가고, 사다리가 있는 칸에 가면 앞으로 간다. 100번 칸에 가기 ..
백준 알고리즘 중급 - 브루트 포스 : 비트마스크 (연습) 근 일주일만의 기록이다. 면접도 준비하고, 바람 좀 쐬느라 늑장을 부렸다. 다시 차근차근, 해오던 거 하자. 정리 시작! - * 부분수열의 합 (mid) : 앞에서 재귀로 풀었던 부분수열의 합 문제를 비트마스크를 이용해서 풀어보자. 14225번: 부분수열의 합 수열 S가 주어졌을 때, 수열 S의 부분 수열의 합으로 나올 수 없는 가장 작은 자연수를 구하는 프로그램을 작성하시오. 예를 들어, S = [5, 1, 2]인 경우에 1, 2, 3(=1+2), 5, 6(=1+5), 7(=2+5), 8(=1+2+5)을 만들 � www.acmicpc.net #include #include using namespace std; bool check[2000001]; int main() { int n; cin >> n; v..
백준 알고리즘 중급 - 브루트 포스 : 재귀 (연습) - 2 지금까지 강의 중에 제일 어려웠다. 백트래킹 부분이 많이 약한 것 같다. 보통 앞의 문제를 풀어보면 요령이 생겨 뒤의 문제를 곧잘 푸는데 이건 정말 손도 못 댔던 것 같다. 그만큼 더 잘 이해하고 넘어가야 하는 이유다.. 하나하나 곱씹으면서 정리해보자. - * N -Queen (high) : 크기가 n*n인 체스판 위에 n개의 queen을 놓는 경우의 수를 구하는 문제다. 9663번: N-Queen N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오. www.acmicpc.net - queen은 상하, 좌우, 대각선까지 다 갈 수 있다. 따라서 queen의 위치를 잡았을 때, 상하좌우..
백준 알고리즘 중급 - 브루트 포스 : 재귀 (연습) - 1 주로 풀었던 문제를 다른 방법으로 푸는 식이었다. 더 빨리 풀리는 문제도 있었고, 오히려 더 느리게 풀리는 문제도 있었다. 어쨌든 재귀를 사용하면 식 자체는 간단해진다. 하지만 까딱 잘못하다가는 메모리가 오버 되거나 무한 루프에 빠지기 쉽다. 제한 조건을 잘 걸어줘야 한다. 정리 시작! - * 로또 (mid) : 앞에서 순열을 사용해서 풀었던 문제를 재귀로 풀어봤다. 6603번: 로또 문제 독일 로또는 {1, 2, ..., 49}에서 수 6개를 고른다. 로또 번호를 선택하는데 사용되는 가장 유명한 전략은 49가지 수 중 k(k>6)개의 수를 골라 집합 S를 만든 다음 그 수만 가지고 번호를 선택하는 www.acmicpc.net #include using namespace std; int k, a[13],..
백준 알고리즘 중급 - 브루트 포스 : 순열 (연습) 드디어 중급 강의 시작! 오픽의 늪에서 드디어 벗어났다. 다시 차근차근 알고리즘 공부 해보자. 처음엔 많이 헤맸는데, 요령을 알고 나니까 술술 풀렸던 파트였다. 그리고 몇가지 기억하면 좋을 꿀팁들이 있었다. 정리 잘 해뒀다가 나중에 문제 풀 때 써먹자. 정리 시작! - * 부등호 (mid) : 앞에서 풀었던 부등호 문제를 순열을 이용해 풀어보자, 2529번: 부등호 두 종류의 부등호 기호 ‘’가 k개 나열된 순서열 A가 있다. 우리는 이 부등호 기호 앞뒤에 서로 다른 한 자릿수 숫자를 넣어서 모든 부등호 관계를 만족시키려고 한다. 예를 들어, 제�� www.acmicpc.net - 브루트 포스를 사용한다면, 최댓값은 9부터 제시된 부등호 개수 + 1 만큼의 수를 모두 배열해서 부등호를 성립하는 값을, 최..
백준 알고리즘 기초 - 트리 어느새 기초 강의의 마지막 챕터다. 한달이 좀 덜 걸렸다. 여기까지만 정리하고 당분간은 오픽에만 집중하고, 시험 치고 나서 중급도 시작해야겠다. 이론적인 내용의 이해가 특히 중요했던 트리 파트였다. 정리 시작! - * 트리 : 사이클이 없는 연결 그래프. (정점 v개, 간선 v-1개) - 조상, 자손 개념은 자기 자신을 포함한다. - 이진 트리 (binary tree) : 자식을 최대 2개만 갖는 트리. 가장 많이 사용한다. - 포화 (perfect) 이진 트리 : 꽉 찬 이진트리. 높이가 h이면 노드 개수 2^h - 1 - 완전 (complete) 이진 트리 : 포화에서 가장 오른쪽에서부터 몇 개가 사라진 형태 * 트리 순회 : 프리오더, 인오더, 포스트오더 - 프리오더 : 노드 -> left -> r..
백준 알고리즘 기초 - bfs 최대한 스스로 풀어보려고 노력했던 파트였다. bfs에 대한 감은 어느정도 왔지만, 아직 연습이 더 필요하다. 특히 덱 부분은 많이 새로웠다. 이번 기회에 잘 정리를 해놓자. 정리 시작! - * bfs : 임의의 정점에 시작해서 모든 정점을 한번씩 방문하는 것. (dfs도 마찬가지) - 너비를 우선으로 탐색하므로, 최단 거리를 구할 수 있는 알고리즘이다. - bfs로 해결할 수 있는 문제는: 최소 비용 문제, 간선의 가중치가 1, 정점과 간선의 개수가 적어야 문제 바로 풀어보자. * 숨바꼭질 (mid) : 수빈이가 동생을 찾을 수 있는 가장 빠른 시간을 구하는 문제다. 1697번: 숨바꼭질 문제 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 ..
백준 알고리즘 기초 - 그래프1 (도전) 푹 쉬고 나니 좀 낫다. 뭘 해도 건강이 우선이다. 다시 차근차근 해나가보자. 정리 시작. - * BFS 스페셜 저지 (mid) : 주어진 경우가 bfs 탐색이 맞는지 확인하는 문제다. 16940번: BFS 스페셜 저지 올바른 순서는 1, 2, 3, 4와 1, 3, 2, 4가 있다. www.acmicpc.net - 처음엔 단순하게 모든 bfs 경우를 생각했을 때 해당 경우가 나오는지 생각해서 풀어봤다. #include #include #include using namespace std; int n, cnt = 1; vector a[100000], ans; bool check[100000]; void bfs(int e) { queue q; check[e] = true; q.push(e); while (!q..