본문 바로가기

Problem Solving/Backjoon15

백준 1644번 - 소수의 연속합(C++) 문제백준, 골드 3, 문제 링크풀이 날짜: 2025.05.18풀이 시간: 23:05~00:11사용 언어: C++문제 해설연속된 소수의 합은 2D 테이블로 표현할 수 있다.$ table[i][j] $ = {i번째 소수부터 j번째 소수까지 연속된 소수의 합}(단, 0 ≤ i ≤ j인 정수 i, j)일반적으로 N 이하의 모든 소수에 대해서는 해당 테이블은 평균적으로 sqrt(N) * sqrt(N)의 셀이 존재한다고 알려져 있다.i > 0일 때, $ table[i][j] = table[0][j] - table[0][i-1] $로 나타낼 수 있다. 왜냐하면, 3~5번째의 연속된 소수의 합은 1~5번째 소수 합에서 1~2번째 연속된 소수의 합을 빼면 되기 때문이다. 이런 식으로 계산하면, table의 첫 번째 행만.. 2025. 5. 19.
백준 32205번 - 네모의 꿈(C++) 문제백준, 실버 4, 문제 링크풀이 날짜: 2025.04.28풀이 시간: 15:59~17:37(1시간 38분)사용 언어: C++문제 해설문제: n개의 삼각형과 각 변의 길이가 주어질 때,같은 길이의 변을 맞닿게 붙여서 네모를 만들 수 있는지 확인해보자.이때 각 변의 길이는 최대 100만이다.N의 최댓값은 50만이므로, 가능한 시간 복잡도는 최대 O(NlogN)이다.네모가 만들어지려면 다음 조건을 만족해야 한다. 같은 길이를 갖는 변이 존재해야 한다길이가 같은 변을 이어붙였을 때 나타날 수 있는 두 가지 이상의 방법 중, 사각형이 되는 경우의 수가 있을 때처음 생각했을 때, 길이가 같은 변을 이어붙일 때 사각형이 되는 경우의 수가 존재할 수도 있다고 생각했다. 그래서 모두 검사해 보기로 했다.그렇다면 삼각.. 2025. 4. 28.
백준 32291번 - x와 x+1의 차이(증명 포함, C++) 문제백준, 실버 1, https://www.acmicpc.net/problem/32291풀이 날짜: 2025.4.15.풀이 시간: 10:49~11:32(43분)사용 언어: C++문제 해설해당 문제는 (x+1)의 자신을 제외한 약수를 구하는 문제이다.우선, 그에 도달하는 과정을 살펴보자.예제 1의 출력을 보면, x = 998일 때 x+1의 자신을 제외한 약수 1, 3, 9, 27, 37, 111, 333이 정답이 된다.이를 보고 출력이 되는 모든 양의 정수 k는 (x+1)의 약수라고 가설을 세울 수 있다.왜 k는 반드시 (x+1)의 약수인가?가설을 세웠으니 증명해 보자.다만 고등학생 때 배웠던 귀류법을 가지고 야매로 증명했다 보니, 정확하지 않을 수 있다는 점 양해 바란다. 잘못된 점이 있다면 지적해주면 .. 2025. 4. 15.
백준 10897번 - Inherited disease(C++) 문제백준, 골드 5, https://www.acmicpc.net/problem/10897풀이 날짜: 2025.4.9.풀이 시간: 2시간 가량알고리즘 분류: 수학, 구현, 트리사용 언어: C++문제 해설d번째 세대의 인원 수는 d!이며 세대 d ≤ 100이므로, 트리를 직접 만들어서는 해결할 수 없다.따라서 수학적으로 해결해야 한다.몇 번의 실험 후, 다음과 같이 식을 세웠다.l 세대 c번째 자손의 번호 F(l, c)는F(l, c) = [1번째부터 (l-1)세대까지 정민의 수] + [(l-1) 세대에서 ‘현재 선택된 부모’의 손위 형제의 수] * l + c와 같이 정의할 수 있다.(다만, F는 이전 입력에 따라 바뀌므로 엄밀히 말하면 함수라고 할 수는 없다.)예를 들어, 예제 입력에서31 2 1출력은 0번.. 2025. 4. 9.
백준 1206번 - 사람의 수(C++) 문제백준, 골드 5, https://www.acmicpc.net/problem/1206알고리즘 분류: 사용 언어: C++문제 해설해당 문제는 처음에 떠올린 해결 방법이 잘못된 경우였다. 그 때문에 고생하기도 했고, 예상했던 부동소수점의 오차 문제에 대해서도 많이 고민하게 한 문제라고 할 수 있다. 하나의 접근 방법을 떠올리고 나서 이를 검증하는 과정이 중요하다는 것을 알 수 있었다.초기 시도: 최소 공배수로 접근하자(실패)처음에는 각 문항별로 필요한 최소 사람의 숫자를 구한 후, 이들 사이에 최소 공배수를 구하는 식으로 접근하였다.계산 시 floating point로 접근하면 정확하게 숫자가 구해지지 않으므로 Fixed Point 자료구조를 직접 구현하도록 했다.그러나 최소 공배수로 구하면 정확히 값이 .. 2025. 4. 3.
백준 28116번 - 선택 정렬의 이동 거리 문제백준, 실버 3, https://www.acmicpc.net/problem/28116풀이 날짜: 2025.3.22풀이 시간: 19:48~19:55, 21:45~21:56(총 18분)알고리즘 분류: 구현, 정렬사용 언어: C++문제 해설선택 정렬에서 각 수의 이동 거리를 계산하는 문제.n의 크기를 보면 최대 500000이므로, O(n^2)의 알고리즘으로는 해결할 수 없다.그러나 중요한 것은 수를 직접 정렬하는 것이 아니기 때문에 O(n^2)보다 더 빨리 해결할 방법이 있다는 것이다.실제로는 선택 정렬에서 수의 교환 횟수는 (n-1)번이다. 선택 정렬에서 가장 시간이 오래 걸리는 작업은 수의 위치를 파악하는 것으로 매 iteration마다 최대 n번의 비교 연산이 필요하다. 이 비교 연산의 횟수를 낮출 .. 2025. 3. 22.
백준 13460번 - 구슬 탈출 2 1. 문제백준, 골드 1, https://www.acmicpc.net/problem/13460풀이 날짜: 2025.3.21.풀이 시간: 10:52~12:24(1시간 32분)알고리즘 분류: 구현, 그래프 탐색, 시뮬레이션, 너비 우선 탐색(BFS)사용 언어: C++2. 문제 해설상, 하, 좌, 우로 이동시킨다는 것은, 위쪽, 아랫쪽, 왼쪽, 오른쪽으로 옮겼을 때에 대한 가능성 트리 노드를 순회하는 것과 같다고 생각할 수 있다.그러면 해당 문제는 이동횟수를 최소화하는 최단 경로 그래프 탐색 문제로 생각할 수 있으므로, 간선의 개수가 이동 횟수인 지금은 BFS를 통해서 탐색하면 된다.탐색할 수 있는 경우의 수는 4가지이고 깊이는 최대 10이므로(10회보다 더 이동할 경우 탐색하지 않음), 경우의 수는 $4^{.. 2025. 3. 21.
백준 11444번 - 피보나치 수 6(C++) 문제백준, 골드, https://www.acmicpc.net/problem/11444풀이 날짜: 2025.3.17.풀이 시간:  총 3시간 51분사용 언어: C++문제 해설수학을 이용한 문제로, 공식을 모르면 풀 수 없다. 여기서는 도가뉴 항등식을 이용하여야 하며, 이를 활용하여 분할정복을 사용하여야 시간복잡도를 최적화할 수 있다.내가 구했던 식 중 하나가 바로 도가뉴 항등식의 특수해로, $a_{2n}$에 대한 식까지는 어떻게든 유도했는데 그다음으로 넘어가는 데에 실패하여 다른 글을 찾아보게 되었다.도가뉴 항등식은 피보나치 등식을 활용하여 변형한 것인데, 도가뉴 항등식은$$ a_{m+n}=a_{m-1}a_n+a_m a_{n+1} $$을 말한다(단, $a_n$은 피보나치 수열의 n번째 수).도가뉴 항등식과.. 2025. 3. 18.
백준 9328번 - 열쇠(C++) 풀이 정리 개요백준, 골드 1, https://www.acmicpc.net/problem/9328풀이 날짜: 2025.2.26.풀이 시간: 10:16~11:37(1시간 21분)알고리즘 분류: 구현, 그래프 탐색 문제사용 언어: C++문제 해설해당 문제는 단순히 그래프 탐색을 구현하는 문제이다.다만 여기서 조사 조건이 여러 개 걸리면서, 따져야 할 상황이 많아지고 있다.나는 탐색하는 방식을 다음과 같이 결정했다.모든 테두리에 대해 *이 아닌 곳은 통과가 가능하다.우선, 탐색할 수 있는 곳을 모두 탐색한다.탐색하는 과정에서 모든 문은 열 수 있으면 열고, 아니면 위치를 저장해 놓는다.탐색 과정에서 $가 나올 때마다 document 개수를 증가시킨다.탐색을 완료한 후, 열리지 않은 문을 조사한다.열리지 않는 문은 다시 .. 2025. 2. 26.