-
2022.09.01
팰린드롬(Palindrome)
팰린드롬(Palindrome) 팰린드롬(Palindrome) 보통 낱말 사이에 있는 띄어쓰기나 문장 부호는 무시하고, 앞으로 읽으나 거꾸로 읽으나 같은 문장 또는 낱말을 회문(回文) 또는 팰린드롬(Palindrome) 이라고 한다. 예) "소주 만 병만 주소", "여보 안경 안보여" 수학에서도 111, 12321과 같이 똑바로 읽으나 거꾸로 읽으나 같은 수를 팰린드롬 수(Palindrome Number) 또는 대칭수라고 한다. 숫자 뒤집기 숫자 k = 123, r = 0 으로 초기화되어 있다고 할 때, 다음의 순환문을 완료하면 k의 값은 0이 되고 r의 값은 k의 값이 거꾸로 뒤집어진 321이 된다. int k = 123; int r = 0; 숫자 뒤집기 알고리즘 while (k != 0) { p = k..
-
2022.08.31
완전제곱수(Perfect Square Number, 제곱수, 정사각수)
완전제곱수(Perfect Square Number, 제곱수, 정사각수) 정사각수(Square Number) 어떤 자연수의 제곱이 되는 `1^{2}, 2^{2}, 3^{2}, 4^{2}`과 같은 수를 완전제곱수(Perfect Square Number) 또는 제곱수(Square Number) 또는 정사각수라고 한다. 1 = 1² 1 + 3 = 2² 1 + 3 + 5 = 3² 1 + 3 + 5 + 7 = 4² 1 + 3 + 5 + 7 + 9 = 5² 위에서와 같이 1부터 연속된 홀수의 합은 언제나 완전제곱수임을 알 수 있다. 완전제곱수 판별하기 ① 약수의 개수를 이용한 완전제곱수 판별 완전제곱수는 약수의 개수가 언제나 홀수개이므로 약수의 개수를 확인하여 완전제곱수인지 판별할 수 있다. 예제 1부터 100까지의..
-
2022.08.31
팩토리얼(Factorial)
팩토리얼(Factorial) 팩토리얼(Factorial) 1부터 N까지 모두 곱한 수를 N 팩토리얼(Factorial)이라 부르며, 기호로는 N!로 나타낸다. N! = 1 x 2 x 3 x ... x N 곱셈 연산을 할 때의 초깃값은 언제나 1이어야 한다. 초깃값이 0일 경우, 어떤 수를 곱해도 항상 0이 된다. 예) 5! = 1 × 2 × 3 × 4 × 5 = 120 예제 5! 구하기 #include using namespace std; int main() { int fact; fact = 1; // 초깃값은 항상 1이어야 한다. for (int i = 1; i
-
2022.08.31
완전수(Perfect Number), 부족수(Deficient Number), 과잉수(Abundant Number)
완전수(Perfect Number), 부족수(Deficient Number), 과잉수(Abundant Number) 완전수(Perfect Number) 그 수 자신을 제외한 모든 약수의 합이 그 수 자신과 같은 수를 완전수(Perfect Number)라고 한다. 예) 6의 약수는 {1, 2, 3, 6} 이고, 그 수 자신을 제외한 1 + 2 + 3의 합은 6과 같으므로 6은 완전수이다. 부족수(Deficient Number) 그 수 자신을 제외한 모든 약수의 합이 그 수 자신보다 작은 수를 부족수(Deficient Number)라고 한다. 예) 8의 약수는 {1, 2, 4, 8} 이고, 그 수 자신을 제외한 1 + 2 + 4의 합은 7과 같으므로 8은 부족수이다. 과잉수(Abundant Number) 그..
-
2022.08.31
가우스 계산법(Gaussian Calculation)
가우스 계산법(Gaussian Calculation) 가우스(1777 ~ 1885, Carl Friedrich Gauss) 가우스(1777 ~ 1885, Carl Friedrich Gauss)의 선생님 뷔트너는 수업 시간에 잠시 쉴 생각으로 학생들에게 1부터 100까지 더하는 문제를 냈다. 가우스는 순식간에 5050 이라는 정답을 알아내었다. 가우스의 천재성을 알아본 뷔트너는 그에게 고등학교 수학 교과서를 선물했다고 한다. 독일의 수학자 가우스는 아르키메데스, 뉴턴과 함께 수학의 역사살 가장 위대한 세 명의 수학자 중 한 명이다. 가우스 계산법 연속된 수 또는 규칙적으로 나열되어 있는 수열 등의 합을 쉽게 계산하기 위해서 사용하는 계산법 일반화하면 다음과 같다. 처음 값부터 마지막 값까지의 합 = (처음..
-
2021.07.22
부분집합의 합 문제(Subset Sum Problem)
부분집합의 합 문제(Subset Sum Problem) 부분집합의 합 문제를 한 문장으로 표현하면 다음과 같음. 음수가 아닌 정수로 이루어진 집합 S와 임의의 정수 x가 주어질 때, S의 부분집합 중에서 그 원소의 합이 x와 같은 부분집합이 존재하는가? 부분집합의 합 문제의 예 S = { 13, 79, 45, 29 } x = 42 → True (13 + 29) x = 25 → False 집합 S가 S = { 13, 79, 45, 29 } 형태로 주어질 경우, S로부터 다음과 같은 16개의 부분집합을 추출할 수 있음. { } { 13 } { 79 } { 45 } { 29 } { 13, 79 } { 13, 45 } { 13, 29 } { 79, 45 } { 79, 29 } { 45, 29 } { 13, 79..
-
2021.07.22
플로이드-워셜 알고리즘(Floyd-Warshall Algorithm)
플로이드-워셜 알고리즘(Floyd-Warshall Algorithm) 모든 쌍 최단 경로(All-Pairs Shortest Path)를 구하는 알고리즘 O(V³)의 시간 복잡도와 O(V²)의 메모리 사용량으로 동작하는 상향식 알고리즘 벨만-포드 알고리즘 그래프의 두 정점 사이의 최단 경로가 출발 정점에서 시작하는 다른 최단 경로와 최종 목표 정점으로 연결된 에지의 조합으로 구성됨. 플로이드-워셜 알고리즘(Floyd-Warshall Algorithm) 은 이러한 개념에 좀 더 광범위한 일반화를 적용함으로써 큰 효과를 얻음. 정점 A와 정점 B 사이의 최단 거리가 AB이고, 정점 B와 정점 C 사이의 최단 거리가 BC이면, 정점 A와 정점 C 사이의 최단 거리는 AB + BC 임. 이 논리는 그 자체로 획기..
-
2021.07.04
코사라주 알고리즘(Kosaraju's Algorithm)
코사라주 알고리즘(Kosaraju's Algorithm) 그래프에서 강한 연결 요소를 찾는 가장 쉽고 널리 사용되는 방법 DFS를 2번 수행하는 형태로 동작함. ① 입력 그래프 자체에 DFS를 수행함. ② 입력 그래프를 전치하여 DFS를 수행함. 코사라주 알고리즘은 일반적으로 DFS 방식 의 순회를 사용하지만, BFS 도 사용할 수 있음. DFS 방식이 전통적인 방식 복잡할 수 있는 문제를 직관적으로 단순화하는 측면에서 매우 효과적이며, 구현하기도 쉬운 편임. 입력 그래프가 인접 리스트 로 표현되어 있을 경우, O(V + E) 형태의 선형 점근적 시간 복잡도 를 갖기 떄문에 매우 효율적임. 코사라주 알고리즘에서 인접 행렬 을 사용하는 것은 권장되지 않음. 그래프 순회에서 각 정점의 이웃을 찾기 위해 상당..
-
2021.07.04
존슨 알고리즘(Johnson's Algorithm)
존슨 알고리즘(Johnson's Algorithm) 벨만-포드 알고리즘 과 다익스트라 알고리즘 의 방법을 결합하여 모든 정점 사이의 최단 경로를 구하는 알고리즘 다익스트라 알고리즘의 효율성을 활용함과 동시에 음수 가중치를 갖는 그래프에 대해서도 올바른 결과를 생성할 수 있음. 상당히 새로운 접근 방법을 사용함. 음수 가중치에 대한 다익스트라 알고리즘의 한계를 극복하기 위해 전체 에지 가중치를 음수가 아닌 형태로 변환 함. 벨만-포드 알고리즘 과 적절한 수학 논리 를 결합하여 이루어짐. 동작 방식 그래프에 새로운 더미(Dummy) 정점 을 추가함. 그리고 이 더미 정점과 나머지 모든 정점 사이에 가중치가 0인 에지를 연결함. 이후 벨만-포드 알고리즘 을 이용하여 더미 정점과 나머지 정점들 사이의 최단 경로..
-
2021.07.02
벨만-포드 알고리즘(Bellman-Ford Algorithm)
벨만-포드 알고리즘(Bellman-Ford Algorithm) 음수 가중치가 있는 그래프를 다룰 때 사용하는 알고리즘 그래프의 모든 에지에 대해 다익스트라의 그리디 선택 방법을 (V - 1)번 반복하여 점진적으로 최단 거리를 찾음. V : 정점의 개수 다익스트라 알고리즘보다 높은 점근적 시간 복잡도를 가짐. 다익스트라 알고리즘이 잘못 해석할 수 있는 그래프에 대해서도 정확한 결과를 제공함. 코드 1 음수 가중치 사이클 이 없을 경우 #include #include #include using namespace std; struct Edge { int src; int dst; int weight; }; const int UNKNOWN = INT_MAX; vector BellmanFord(vector edge..
-
2021.06.30
다익스트라 최단 경로 알고리즘(Dijkstra Shortest Path Algorithm)
다익스트라 최단 경로 알고리즘(Dijkstra Shortest Path Algorithm) 그래프에서 단일 시작(Single Start) 최단 경로 문제(Shortest Path Problem) 구글 지도 또는 자동차 내비게이션 등에서 경로를 탐색할 때 사용됨. 문제 정의 주어진 그래프 G = 의 시작 정점(Source Vertex) 과 목적 정점(Destination Vertex) 이 주어질 때, 시작 정점에서 목적 정점까지 이어지는 최소 비용 경로를 구하시오. V : 정점의 집합 E : 에지의 집합 각각의 에지는 가중치를 가지고 있음. 다익스트라 알고리즘(Dijkstra's Algorithm) 음수 가중치가 없는 그래프에서 동작하는 최단 경로 탐색 알고리즘 프림의 MST 알고리즘을 약간 변경한 형태 ..
-
2021.06.30
프림의 최소 신장 트리 알고리즘(Prim's Minimum Spanning Tree Algorithm)
프림의 최소 신장 트리 알고리즘(Prim's Minimum Spanning Tree Algorithm) MST 문제 정점 집합 V의 가중치를 갖는 에지 집합 E로 구성된 그래프 G = 가 주어질 때, 모든 정점을 연결하고 연결된 에지의 가중치 합이 최소인 트리 T를 구하는 문제 크루스칼 알고리즘(Kruskal Algorithm) 그래프의 모든 에지를 최소 힙 에 추가하고, 사이클을 만들지 않는 최소 가중치의 에지를 이용하여 MST를 구성함. 프림 알고리즘(Prim's Algorithm) BFS의 동작 방식과 유사함. 먼저 시작 정점을 이용하여 경계를 구성함. 경계는 이전에 방문했던 정점들에 의해 구성됨. 현재 경계에 인접한 정점을 반복적으로 탐색함. 이때 프림 알고리즘은 경계를 관통하는 에지 중에서 가장..
-
2021.06.30
깊이 우선 탐색(DFS, Depth-First Search)
깊이 우선 탐색(DFS, Depth-First Search) 너비 우선 탐색(BFS, Breadth-First Search) 시작 장점에서 시작하여 점차 탐색 범위를 넓혀 나가는 방식 방문하지 않은 정점을 저장하기 위해 큐(Queue) 를 사용함. 선입선출(FIFO) 자료구조 큐에 있는 정점들은 큐에 들어갔던 순서대로 제거됨. 이러한 큐의 속성을 이용하여 시작 정점에 가까이 있는 정점들을 먼저 처리할 수 있음. 시간 복잡도 : O(V + E) 깊이 우선 탐색(DFS, Depth-First Search) 시작 정점에서 시작하여 특정 경로를 따라 가능한 멀리 있는 정점을 재귀적으로 먼저 방문하는 방식 더 방문할 정점이 없어지면, 다른 경로를 찾아 다시 멀어지는 방향으로 탐색을 반복함. 이러한 그래프 탐색 방..
-
2021.06.30
너비 우선 탐색(BFS, Breadth-First Search)
너비 우선 탐색(BFS, Breadth-First Search) 시작 정점을 경계(Frontier)에 추가하는 것으로 시작함. 경계는 이전에 방문했던 정점들 에 의해 구성됨. 현재 경계에 인접한 정점을 반복적으로 탐색함. 시간 복잡도 : O(V + E) V : 정점의 개수 E : 에지의 개수 모든 정점에 대해 자식 정점을 손자 정점보다 먼저 방문한다 는 점이 중요한 특징 BFS를 구현할 경우, 보통 경계를 별도의 자료구조로 만들어서 명시적으로 사용하지는 않음. 대신 정점 ID를 큐(Queue) 에 저장하여 시작 정점과 가까운 정점을 멀리 있는 정점보다 먼저 방문할 수 있도록 구현함. 동작 과정 ① 먼저 시작점인 우리집 정점을 방문함. 빨간색 점선 : 현재 경계 인접한 정점으로 R1과 R2가 있음. ② R..
-
2021.06.28
그래프 순회 문제(Graph Traversal Problem) ; 그래프 탐색 문제(Graph Search Problem)
그래프 순회 문제(Graph Traversal Problem) ; 그래프 탐색 문제(Graph Search Problem) 그래프의 특정 정점에서 시작하여 나머지 모든 정점을 방문하는 문제 그래프 순회 문제를 수학적으로 표현할 경우 그래프 G = 가 주어질 떄, 특정 정점 s로부터 시작하여 모든 정점 v ∈ V를 방문하는 문제라고 할 수 있음. 그래프 순회 문제는 그래프에서 특정 정점을 찾기 위한 용도 로 사용될 수 있기 떄문에 그래프 탐색 문제(Graph Search Problem) 라고도 부름. 여러 그래프 탐색 알고리즘이 존재하고, 각각은 서로 다른 순서로 모든 정점을 방문함. 종류 너비 우선 탐색(BFS, Breadth-First Search) 깊이 우선 탐색(DFS, Depth-First Sea..
-
2021.06.27
웰시-포웰 알고리즘(Welsh-Powell Algorithm)
웰시-포웰 알고리즘(Welsh-Powell Algorithm) 차수(Degree) 가 높은 정점부터 차례대로 그래프 컬러링을 수행하는 방법 다음의 순서를 따름. ① 단계 모든 정점을 차수에 대한 내림차순으로 정렬하고 배열에 저장함. ② 단계 정렬된 배열에서 색상이 지정되지 않은 첫 번째 정점을 선택하고, 이 정점과 연결된 모든 정점을 조사하여 아직 사용되지 않은 색상을 해당 정점에 지정함. 이 색상을 C라고 지칭하겠음. ③ 단계 정렬된 배열에서 색상이 지정되지 않은 정점을 모두 찾고, 만약 이 정점의 이웃이 C 색상을 가지고 있지 않다며 해당 정점에 C 색상을 지정함. ④ 단계 배열에 색상이 지정되지 않은 정점이 남아 있다면 ②단계로 이동함. 남아 있는 정점이 없다면 종료함. 이때까지 정점에 지정된 색상..
-
2021.06.26
크루스칼 최소 신장 트리 알고리즘(Kruskal Minimum Spanning Tree Algorithm)
크루스칼 최소 신장 트리 알고리즘(Kruskal Minimum Spanning Tree Algorithm) 최소 신장 트리(Minimum Spanning Tree) 정점(Vertex) 의 집합 V와 가중치를 갖는 에지(Edge) 의 집합 E로 구성된 그래프 G = 가 주어질 때, 모든 정점을 연결하고 연결된 에지의 가중치 합이 최소 인 트리 T 크루스칼 최소 신장 트리 알고리즘(Kruskal Minimum Spanning Tree Algorithm) 1956년에 발표됨. 알고리즘 ① 그래프 G의 모든 에지를 최소 힙 H에 추가함. ② H로부터 에지 e를 하나 꺼냄. e : 모든 에지 중에서 가장 가중치가 작은 에지 ③ e이 양 끝 정점이 이미 T에 있을 경우, e로 인해 T에서 사이클이 발생할 수 있음...
-
2021.06.25
분할 가능 배낭 문제(Fractional Knapsack Problem)
분할 가능 배낭 문제(Fractional Knapsack Problem) 0-1 배낭 문제 에서 다음 조건 추가 주어진 물건(O)을 원하는 형태로 얼마든지 분할 할 수 있음. 각 물건의 일부분만을 배낭에 담을 수 있음. 실생활의 예) 상인이 기름, 곡물, 밀가루와 같은 품목을 다룰 경우 각 품목을 원하는 양만큼 덜어내서 배낭에 담을 수 있음. 일반 배낭 문제가 NP-완전 문제 인 것과 달리 분할 가능 문제 는 간단한 솔루션이 존재함. 각 물건을 단위 무게(W)당 가격(V)을 기준으로 정렬함. 그리디 방식 에 따라 단위 무게당 가격이 높은 순서 로 물건을 선택함. 분할 가능 배낭 문제의 예 배낭 용량(T)이 8인 경우에 선택할 수 있는 최선의 물건 조합 코드 #include #include #include..
-
2021.06.25
0-1 배낭 문제(0-1 Knapsack Problem)
0-1 배낭 문제(0-1 Knapsack Problem) 조건 물건들의 집합 O = {O₁, O₂, ..., On}이 있을 경우 Wi : i번째 물건 Oi의 무게 Vi : i번째 물건의 가격(Value) 최대 무게를 T까지 견딜 수 있는 가방(배낭)이 1개 주어짐. 물건들을 가방에 담아야 함. 가방에 넣은 물건들의 가격(V) 합이 최대가 되도록 물건 선택 단, 물건들의 무게 합이 T를 넘지 않아야 함. 예 : 무역을 하는 상인이 매출의 일정 비율을 이익으로 가져갈 떄 이익을 극대화하려면 최대한 비싼 물건들을 가지고 다니면서 팔아야 하지만, 사용할 수 있는 운송 수단(또는 배낭)에는 최대 T 무게까지의 물건말 실을 수 있음. 각각의 물건에 대한 무게(W)와 가격(V)은 이미 알고 있음. 물건들을 어떻게 조..
-
2021.06.24
최단 작업 우선 스케줄링(Shortest-Job-First Scheduling)
최단 작업 우선 스케줄링(Shortest-Job-First Scheduling) 그리디 알고리즘(Greedy Algorithm)으로 해결할 수 있는 문제 중 하나 예 : 은행 창구 하나의 창구에서만 업무를 보고 있음. 대기열에 N명의 사람이 기다리고 있음. 서로 다른 용무로 방문했기 떄문에 일 처리에 필요한 시간은 사람들마다 서로 다름. 대기열에 기다리고 있던 모든 사람이 매우 합리적이어서 평균 대기 시간이 최소화될 수 있도록 대기 순서를 다시 정하는 것 에 동의하였음. 그래서 이제 대기 순서를 어떻게 바꿔야 하는지를 결정해야 함. 항목 Pi : i번째 사람 Ai : Pi의 일 처리 시간 Wi : Pi가 기다려야 하는 시간 창구에서 가까운 사람이 먼저 일을 처리할 수 있으므로 첫 번째 사람 P0의 대기 ..
-
2021.06.07
선형 시간 선택(Linear Time Selection)
선형 시간 선택(Linear Time Selection) 각 단계에서 문제를 2개 이상 분할하여 문제를 해결하는 알고리즘 ① 벡터 $V$가 주어지면, 여기서 i번째로 작은 원소를 찾으려고 함. ② 입력 벡터 $V$를 $V_{1}, V_{2}, V_{3}, ..., V_{n/5}$ 으로 분할함. 각각의 부분 벡터 $V_{i}$ 는 5개의 원소를 가지고 있음. 마지막 $V_{n/5}$ 는 5개 이하의 원소를 가질 수 있음. ③ 각각의 $V_{i}$ 를 정렬함. ④ 각각의 $V_{i}$ 에서 중앙값 $m_{i}$ 를 구하고, 이를 모아서 집합 M을 생성함. ⑤ 집합 M에서 중앙값 q를 찾음. ⑥ q를 피벗으로 삼아 전체 벡터 V를 L과 R의 두 벡터로 분할함. ⑦ 이러한 방식으로 분할하면 부분 벡터 L은 q보..
-
2021.06.02
[C++] 퀵 정렬(Quick Sort)
퀵 정렬(Quick Sort) 퀵 정렬은 분할 정복(Divide and Conquer) 알고리즘 을 이용하여 구현됨. 병합 정렬과 퀵 정렬의 비교 병합 정렬(Merge Sort) 대용량의 데이터 정렬 퀵 정렬(Quick Sort) 평균 실행 시간을 줄이는 것 기본 아이디어는 병합 정렬과 같음. 원본 입력 배열을 작은 크기의 부분 배열로 나눔. 각 부분 배열을 정렬함. 그 결과를 합쳐서 전체 정렬 배열을 생성함. 핵심 병합(Combine)이 아니라 분할(Split) 입력 배열이 주어지고, 입력 배열 중 피벗(Pivot) 원소 P를 선택했을 경우, 퀵 정렬을 위한 분할 연산 은 다음의 2단계로 이루어짐. ① 입력 배열을 2개의 부분 배열 R과 L로 나눔. L 입력 배열에서 P 보다 작거나 같은 원소를 포함하..
-
2021.06.02
[C++] 병합 정렬(Merge Sort)
병합 정렬(Merge Sort) 병합 정렬은 분할 정복(Divide and Conquer) 알고리즘 을 이용하여 구현됨. 병합 알고리즘은 다음과 같은 과정으로 정렬을 수행함. ① 많은 원소로 구성된 전체 집합을 작은 크기의 부분 집합 으로 나눔. ② 각각의 부분 집합을 정렬함. ③ 정렬된 부분 집합을 오름차순 또는 내림차순 순서를 유지함. ④ 각각의 부분 집합을 합침. 그림) 병합 정렬을 사용하여 정수 배열을 정렬하는 예 전체 배열을 여러 개의 부분 배열로 나누는 작업을 반복함. 각 부분 배열이 하나의 원소를 가질 때 멈춤. (1단계 ~ 4단계) 이후에는 다시 배열을 합치는 작업을 반복함. 합쳐진 배열의 원소 순서가 오름차순을 유지하도록 조정함. 코드 템플릿을 사용하여 정렬할 데이터 타입에 의존적이지 않..
-
2021.02.17
[C++] 정수를 입력 받아 각 자릿수의 합 구하기
정수를 입력 받아 각 자릿수의 합 구하기 정수를 입력 받아 각 자릿수의 합을 구하려면 다음과 같이 사용하면 된다. ■ 알고리즘 1. 입력 받은 수(num)와 10을 나머지 연산을 수행한 후, 결과값을 sum 변수에 계속 더해준다. (sum += num % 10) 2. 입력 받은 수(num)을 10으로 계속 나누어준다. (num /= 10) 3. 입력 받은 수가 0이 될 때까지 1, 2번 과정을 반복한다. ■ 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include using namespace std; int main() { int num, sum = 0; cin >> num; while (num != 0) { sum += num % 10; num /= 10; } cout
-
2020.12.31
[Project Euler #16][C++] $2^{1000}$ 의 각 자릿수를 모두 더하면?
문제16 : $2^{1000}$ 의 각 자릿수를 모두 더하면? 문제 $2^{15} = 32768$ 의 각 자릿수를 더하면 3 + 2 + 7 + 6 + 8 = 26 입니다. $2^{1000}$ 의 각 자릿수를 모두 더하면 얼마입니까? 문제 해결 방법 2^{1000}21000 은 너무나 큰 수이기에 C++ 의 정수형 변수에 대입할 수 없다. 그래서 string 자료형을 이용하여 문제를 해결하였다.내용 참고 : click참고char형 숫자 -> int형 숫자 : char형 숫자 - '0'int형 숫자 -> char형 숫자 : int형 숫자 + '0' 소스 코드 정답 1366 심화 공부 숫자의 거듭제곱 계산(Computing Powers of a Number) x를 nn번 곱한 수를 x^nxn이라 한다. 현재의..
-
2020.12.28
0부터 N까지 피보나치 수열 나열하기
입력을 받으면, 입력한 수까지 피보나치 수열을 나열하는 프로그램 for 문/while 문/do while 문으로 간단하게 구현함.(+ 재귀 함수/ goto 문 이용하기) 시간 복잡도 : O(n) 200 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
-
2020.12.28
[Project Euler #15][C++] 20×20 격자의 좌상단에서 우하단으로 가는 경로의 수
문제15 : 20×20 격자의 좌상단에서 우하단으로 가는 경로의 수 문제 아래와 같은 2 × 2 격자의 왼쪽 위 모서리에서 출발하여 오른쪽 아래 모서리까지 도달하는 길은 모두 6가지가 있습니다 (거슬러 가지는 않기로 합니다). 그러면 20 × 20 격자에는 모두 몇 개의 경로가 있습니까? 문제 해결 방법 격자에서 최단 경로의 수 를 찾는 문제이다.규칙성을 찾아 문제를 해결하였다.배열 ary[20][20]에서 ary[n][n] = ary[n - 1][n] + ary[n][n - 1]이다.for 문을 사용하여 ary[x][0]과 ary[0][x]의 값을 모두 1로 설정하였다.그리고 또 다른 for 문을 사용하여 찾은 규칙성을 바탕으로 배열에 값을 채워서 최종적으로 ary[SIZE][SIZE]에 있는 값이 출..
-
2020.12.27
[Project Euler #13][C++] 50자리 수 100개를 더한 값의 첫 10자리 구하기
문제13 : 50자리 수 100개를 더한 값의 첫 10자리 구하기 문제 아래에 50자리 수가 100개 있습니다. 이것을 모두 더한 값의 첫 10자리는 얼마입니까?37107287533902102798797998220837590246510135740250 46376937677490009712648124896970078050417018260538 74324986199524741059474233309513058123726617309629 91942213363574161572522430563301811072406154908250 23067588207539346171171980310421047513778063246676 89261670696623633820136378418383684178734361726757 28..
-
2020.12.26
[Project Euler #12][C++] 500개 이상의 약수를 갖는 가장 작은 삼각수는?
문제12 : 500개 이상의 약수를 갖는 가장 작은 삼각수는? 문제 1부터 n까지의 자연수를 차례로 더하여 구해진 값을 삼각수라고 합니다. 예를 들어 7번째 삼각수는 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28이 됩니다. 이런 식으로 삼각수를 구해 나가면 다음과 같습니다. 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... 이 삼각수들의 약수를 구해 봅시다. 1: 1 3: 1, 3 6: 1, 2, 3, 6 10: 1, 2, 5, 10 15: 1, 3, 5, 15 21: 1, 3, 7, 21 28: 1, 2, 4, 7, 14, 28 위에서 보듯이, 5개 이상의 약수를 갖는 첫번째 삼각수는 28입니다.그러면 500개 이상의 약수를 갖는 가장 작은 삼각수는 얼마입니까? 문제 해..
-
2020.12.26
숫자 N의 약수의 개수 구하기
*숫자 N의 약수의 개수 구하기 1부터 N까지 for문을 돌리면서 나누어 떨어지는 수가 있으면(i % N == 0) 카운트를 증가시켜(count++) 최종적으로 카운터를 출력하면 끝. 123456789101112131415161718#include using namespace std; int checkCommonDivisor(int n) { int count = 0; for (register int i = 1; i