본문 바로가기
반응형

알고리즘207

백준 1309번 동물원 - C++ 풀이 1. dp(idx, prev) : (idx-1) 번째 행의 상태가 prev일 때 idx번 행~마지막까지 채우는 방법의 수 2. prev = 0 이면, dp(idx, prev) = dp(idx+1, 0) + dp(idx+1, 1) + dp(idx+1, 2) 3. prev > 0 이면, dp(idx, prev) = dp(idx+1, 0) + dp(idx+1, 3-prev) 1. dp(idx, prev) : (idx-1)번째 행의 상태가 prev일 때 idx번 행~마지막까지 채우는 방법의 수 dp(idx, prev)를 위와 같이 정의하자. 사자가 세로로 붙어있을 수 없으므로 prev값이 필요하다. 이때 사자가 가로로 붙어있을 수 없으므로 한 행 내의 사자 상태는 아예 없거나, 오른쪽 칸에만 있거나, 왼쪽 칸에.. 2022. 9. 22.
백준 6588번 골드바흐의 추측 - C++ 풀이 1. n 이하의 모든 소수 i에 대해 (n-i)가 소수인지 판별한다. 1. n 이하의 모든 소수 i에 대해 (n-i)가 소수인지 판별한다. 에라토스테네스의 체를 이용하여 백만 이하의 모든 소수를 구한다. n이하의 모든 소수 i에 대해 n-i가 소수인지 판별하면 된다. 이때 i를 오름차순으로 순회하고, 답이 나올 경우 순회를 종료시키면 b-a가 가장 큰 답을 구할 수 있다. 백만 이하의 소수 개수는 약 8만 개이므로, 이 풀이의 시간 복잡도는 O(80,000*T)이다. 이때 T(테스트 케이스 수)가 10^5이므로 시간 초과가 날 것 같았는데 시간 초과가 나지 않았다. 이에 관련된 질문과 답을 아래 게시글에서 발견하였다. 글 읽기 - 이 문제 제한시간이 1초인데 왜 되나요? 댓글을 작성하려면 로그인해야 합니.. 2022. 9. 20.
백준 2583번 영역 구하기 - C++ 풀이 1. 직사각형이 없는 칸을 그래프의 노드로 생각하고, 인접한 모든 노드를 간선으로 잇는다. 2. 완성된 그래프에서 각 연결 요소의 크기와 연결 요소의 개수를 센다. 1. 직사각형이 없는 칸을 그래프의 노드로 생각하고, 인접한 모든 노드를 간선으로 잇는다. 유의미한 칸은 직사각형이 없는 칸이다. 직사각형이 없는 칸을 그래프의 노드로 생각하고, 인접한 모든 노드를 간선으로 이어 그래프로 만들어준다. 2. 완성된 그래프에서 각 연결 요소의 크기와 연결 요소의 개수를 센다. 이제 각 영역은 연결 요소와 같다. DFS/BFS로 연결 요소의 개수를 세는 동시에 각 연결 요소의 크기도 구해준다. 연결 요소의 개수는 총 DFS/BFS의 호출 횟수이고, 각 연결 요소의 크기는 한 DFS/BFS에서 방문한 노드의 개수와 .. 2022. 9. 19.
백준 17779번 게리맨더링 2 - C++ 풀이 1. 모든 (x, y, d1, d2) 쌍에 대해 선거구 나누기를 하여 최적화한다. 1. 모든 (x, y, d1, d2) 쌍에 대해 선거구 나누기를 하여 최적화한다. 가능한 모든 (x, y, d1, d2) 쌍은 N^4개, 선거구 나누기 시뮬레이션에 O(N^2)의 시간 복잡도가 소요되므로, 전체 시간 복잡도는 O(N^6). 이때 N=20이므로 브루트 포스로 해결할 수 있다. 선거구 나누기 시뮬레이션은 주어진 조건을 잘 구현하면 되고, 경계선으로 둘러싸인 5번 선거구는 DFS로 처리해주었다. #include #include #include using namespace std; const int INF = 987654321; int N; int A[20][20]; int board[20][20]; bool va.. 2022. 9. 18.
백준 2170번 선 긋기 - C++ 풀이 1. 선분들을 시작점 오름차순으로 정렬한다. 2. 스위핑하면서 모든 선분의 길이를 더한다. 1. 선분들을 시작점 오름차순으로 정렬한다. 스위핑을 통해 해결할 수 있는 문제이다. 왼쪽부터 스위핑하면서 선분의 총 길이를 계산해줄 것이다. 이 작업을 위해 먼저 주어진 선분들을 시작점 오름차순으로 정렬한다. 2. 스위핑하면서 모든 선분의 길이를 더한다. 이제 왼쪽부터 스위핑하면서 모든 선분의 길이를 더한다. 중간에 겹치는 선분들을 하나의 선분으로 만들어주면서 이동해주면 된다. 현재 처리중인 선분의 시작점과 끝점 좌표를 각각 s, e, 다음 선분의 시작점과 끝점 과표를 각각 ns, ne라고 하자. 시작점 오름차순으로 정렬해주었기 때문에 s ≤ ns임은 보장되어 있다. 따라서 ns < e 이면, 현재 선분과 다음 .. 2022. 9. 15.
반응형