별의 공부 블로그 🧑🏻‍💻

🗒️ algorithm (38)

728x90
  1. 2020.12.22 [Project Euler #7][C++] 10001번째의 소수

    문제7: 10001번째의 소수 문제 소수를 크기 순으로 나열하면 2, 3, 5, 7, 11, 13, ... 과 같이 됩니다. 이 때 10,001번째의 소수를 구하세요. 문제 해결 방법 하나하나씩 계산하는 방식(브루트 포스 방식)으로 문제를 해결하였다.2중 for문을 사용하여1부터 N까지 순회를 하면서 소수의 조건(나머지가 1과 그 자신인 수) 을 만족시키는 수가 발견될 경우 count의 값을 1씩 증가시켰다.count의 값이 NUM(10001)이 되었을 때의 값을 ans 변수에 할당하고, 2중 for문에서 빠져나오도록 하였다.NUM(10001)번째 소수가 담긴 ans 변수의 값을 출력하도록 하였다.연산을 빠르게 하도록 하기 위해 register 변수를 사용하여 for문을 순회하도록 하였다. 소스 코드 1..

  2. 2020.11.16 [Project Euler #5][C++] 1 ~ 20 사이의 어떤 수로도 나누어 떨어지는 가장 작은 수

    문제5 : 1 ~ 20 사이의 어떤 수로도 나누어 떨어지는 가장 작은 수 문제 1 ~ 10 사이의 어떤 수로도 나누어 떨어지는 가장 작은 수는 2520입니다. 그러면 1 ~ 20 사이의 어떤 수로도 나누어 떨어지는 가장 작은 수는 얼마입니까? 문제 해결 방법 하나하나씩 계산하는 방식(브루트 포스 방식)으로 문제를 해결하였다.문제의 조건을 만족시키는 범위를 알 수 없는 수를 찾기 위해 unsigned long long int 자료형을 사용하였다.표현 가능 범위 : 0 ~ 18,446,744,073,709,551,6152중 for 문을 사용하였다.시간 복잡도 : O(n²)1부터 ULLONG_MAX까지 순회하는 for 문1부터 N(20)까지 순회하는 for 문1부터 ULLONG_MAX까지 순회하는 수 중에서,..

  3. 2020.11.15 [Project Euler #4][C++] 세자리 수를 곱해 만들 수 있는 가장 큰 대칭수

    문제4 : 세자리 수를 곱해 만들 수 있는 가장 큰 대칭수 문제 앞에서부터 읽을 때나 뒤에서부터 읽을 때나 모양이 같은 수를 대칭수(palindrome)라고 부릅니다. 두 자리 수를 곱해 만들 수 있는 대칭수 중 가장 큰 수는 9009 (= 91 × 99) 입니다. 세 자리 수를 곱해 만들 수 있는 가장 큰 대칭수는 얼마입니까? 문제 해결 방법 팰린드롬 찾기 알고리즘 을 이용하여 문제를 해결하였다.우선, 팰린드롬 검사 함수(bool findPalindrome(string ary))를 만들었다.2중 for 문을 사용하여 100부터 999까지 순회를 하면서 곱한 수를 string형으로 바꾼 후(to_string(i * j)), 하나하나씩 팰린드롬 검사를 수행하였다. (findPalindrome(to_stri..

  4. 2020.11.11 피보나치 수열(Fibonacci Sequence)

    피보나치 수열(Fibonacci Sequence)의 점화식은 다음과 같다. $F_{n}:=\begin{cases} 0 \quad (\text{if} \quad n = 1) \\ 1 \quad (\text{if} \quad n = 2) \\ F_{n-1} + F_{n-2} \quad (\text{if} \quad n > 2) \end{cases}$ 이 점화식을 바탕으로 구한 피보나치 수열의 항과 값은 다음과 같다. 항 1 2 3 4 5 6 7 8 9101112131415161718... 값 0 1 1 2 3 5 8 13 213455891442333776109871597... 피보나치 수열은 재귀 함수 또는 반복문을 이용하여 구현할 수 있다. 1. 반복문을 이용하여 구현하기 123456789101112131..

  5. 2020.11.02 버블 정렬(Bubble Sort)

    *버블 정렬(Bubble Sort) 12345678910111213141516171819202122232425#include #define SIZE 5 int main() { int i, k; int list[SIZE] = {16, 7, 9, 1, 3}; // 배열의 요소 정렬 for (k = 0; k

  6. 2020.08.13 탐욕 알고리즘(Greedy Algorithm)

    *탐욕 알고리즘 탐욕 알고리즘(Greedy Algorithm) - 결과값에 대하여 생각하지 않고 최선의 옵션을 선택하여 문제를 해결하는 알고리즘 - 즉, 지역적(locally)의 최선의 선택이 전역적(globally)의 최상의 결과값을 생성하도록 하는 것을 목표로 하는 알고리즘.- 미리 정한 기준에 따라서 매번 가장 좋아 보이는 답을 선택하는 알고리즘 - 탐욕 알고리즘은 해답에 포함될 원소들을 차례로 선택하는 과정을 거치게 됨 - 각 단계에서는 전체적인 상황을 종합적으로 판단하고, 고려하여 결정하는 것이 아니라 현 시점의 정보 를 바탕으로 가장 이익이 되는 원소들을 선택함. - 동적 계획법(Dynamic Programming)과 마찬가지로 최적화 문제(Optimization Problem) 를 푸는데 사..

  7. 2020.06.08 Union-Find 알고리즘(서로소 집합 알고리즘)

    *Union-Find 알고리즘 - Disjoint-Set(서로소 집합) 알고리즘이라고 불린다. - 지금 추가하고자 하는 간선의 양끝 정점이 같은 집합에 속해 있는지를 검사하는 알고리즘.- 간선의 양끝 정점이 서로 다른 집합에 속하는 경우, 두 정점을 연결하여도 사이클이 형성되지 않는다.- Kruskal MST 알고리즘을 구현하는데 사용된다. #include #define MAX_VERTICES 100 int parent[MAX_VERTICES]; // 부모 노드int num[MAX_VERTICES]; // 각 집합의 크기 // 초기화void set_init(int n) { int i; for (i = 0; i < n; i++) { parent[i] = -1; num[i] = 1; }} // vertex가..

  8. 2017.06.18 [C] 정렬(Sorting)

    정렬(Sorting) - 정렬(sorting) : 물건을 크기순으로 오름차순(ascending order)이나 내림차순(descending order)으로 나열하는 것. - 정렬은 컴퓨터공학을 포함한 모든 과학 기술 분야에서 가장 기본적이고 중요한 알고리즘 중의 하나로 일상생활에서 많이 사용됨. - 정렬은 자료 탐색에 있어서 필수적임. - 일반적으로 정렬시켜야 될 대상은 레코드(record)라고 불림. - 레코드는 다시 필드(field)라고 하는, 더 작은 단위로 나누어짐. - 여러 필드 중에서 특별히 레코드와 레코드를 식별해주는 역할을 하는 필드를 키(key)라고 함. 레코드 { [필드][필드][필드][필드][필드][필드][필드][필드][필드][필드] 레코드 { [필드][필드][필드][필드][필드][필..

728x90


📖 Contents 📖