Computer >> 컴퓨터 >  >> 프로그래밍 >> 프로그래밍

프로그래밍

  1. 하노이 타워(Tower of Hanoi) 문제 완벽 정리: 규칙부터 재귀 알고리즘, C++ 구현까지

    하노이 타워란 무엇인가?하노이 타워(Tower of Hanoi)는 전 세계적으로 유명한 수학 퍼즐 문제입니다. 이 문제는 세 개의 기둥과 n개의 원반(디스크)으로 구성됩니다. 처음에는 모든 원반이 첫 번째 기둥(출발지)에 크기 순서대로 쌓여 있으며, 최종적으로 모든 원반을 세 번째 기둥(목적지)으로 옮겨야 합니다. 이때 두 번째 기둥은 중간 과정에서 원반을 임시로 옮겨두는 보조 기둥 역할을 합니다.하노이 타워의 규칙원반을 옮길 때는 반드시 아래 세 가지 규칙을 지켜야 합니다.한 번의 이동으로는 단 하나의 원반만 옮길 수 있습니다.각

  2. 최소 비용으로 N개의 로프 연결하기 – 힙(Heap) 알고리즘 풀이

    주어진 길이를 가진 N개의 로프가 있습니다. 이 로프들을 모두 하나로 연결해야 하는데, 두 로프를 연결할 때 드는 비용은 두 로프 길이의 합입니다. 목표는 N개의 로프를 최소 비용으로 모두 연결하는 것입니다.이 문제는 힙 트리(Heap Tree), 그중에서도 최소 힙(Min Heap)을 활용하면 효율적으로 해결할 수 있습니다. 먼저 모든 로프의 길이를 최소 힙에 삽입한 뒤, 가장 짧은 로프와 두 번째로 짧은 로프를 꺼내 연결합니다. 연결된 새 로프의 길이(두 길이의 합)는 다시 힙에 삽입합니다. 이 과정을 반복하여 힙에 요소가 하나

  3. 10진수를 로마 숫자로 변환하는 방법

    로마 숫자란 무엇인가?로마 숫자는 자릿값(위치)에 따라 값이 달라지지 않는 비위치적(non-positional) 기수법입니다. 여러 개의 기호를 나란히 조합하여 하나의 수를 표현하며, 각 기호의 값을 모두 더해 전체 숫자를 나타냅니다.예를 들어 75라는 숫자는 50 + 10 + 10 + 5로 분해할 수 있으며, 이를 로마 숫자로 표현하면 LXXV가 됩니다.이 글에서는 10진수 형태로 주어진 숫자를 로마 숫자 문자열로 변환하는 방법과, 이를 구현한 알고리즘 및 C++ 코드를 살펴보겠습니다.로마 숫자 기호와 값로마 숫자에서 사용되는 기

  4. 동적 계획법으로 정확히 k개의 간선을 거쳐 출발점에서 목적지까지 가는 워크(Walk) 개수 구하기

    방향 그래프(directed graph)가 주어져 있습니다. 여기에 두 정점 u와 v가 추가로 주어지며, u는 시작 정점, v는 끝 정점입니다. 이때 풀어야 할 과제는 정점 u에서 v까지 정확히 k개의 간선을 거쳐 가는 워크(walk)의 개수를 찾는 것입니다. k의 값 역시 알고리즘의 입력으로 함께 제공됩니다. 이 문제는 동적 계획법(Dynamic Programming)으로 해결할 수 있습니다. 핵심은 행(row)에는 u의 값을, 열(column)에는 v의 값을 배치하고, 깊이(depth) 차원으로 시작점부터 끝점까지 사용한 간선의

  5. 분할 정복 알고리즘으로 두 이진수를 빠르게 곱하는 방법

    두 개의 이진수(binary) 문자열로 표현된 숫자가 주어졌을 때, 기존의 단순 곱셈 방식보다 더 빠르고 효율적으로 두 수의 곱을 계산하는 것이 이 글의 목표입니다. 자릿수를 하나씩 곱하는 전통적인 방법은 숫자의 길이가 길어질수록 성능이 급격히 떨어집니다. 분할 정복(Divide and Conquer) 전략을 활용하면 이 문제를 훨씬 효율적으로 해결할 수 있습니다. 핵심 아이디어는 각 숫자를 절반 크기의 두 부분으로 나눈 뒤 재귀적으로 곱하는 것입니다. 첫 번째 수 X를 왼쪽 절반 Xleft와 오른쪽 절반 Xright로 나누고, 두

  6. 숫자를 영어 단어로 변환하는 알고리즘

    숫자를 영어 단어로 변환하는 알고리즘 이 알고리즘은 주어진 숫자를 그에 대응하는 영어 단어로 변환합니다. 예를 들어 564를 입력하면 Five Hundred and Sixty-Four라는 결과를 얻습니다. 변환 과정에서는 숫자 범위별로 미리 정의된 문자열 목록을 활용합니다. 알고리즘은 입력값의 크기를 판단해 목록에서 알맞은 단어를 꺼내고, 필요하면 재귀 호출을 통해 나머지 자릿수를 계속 처리하여 최종 문장을 완성합니다. 미리 정의된 문자열 목록 Units(일의 자리): 0~9에 해당하는 단어를 저장합니다. (Zero, One, .

  7. 플러드 필(Flood Fill) 알고리즘: 개념, 동작 원리, C++ 구현 예제

    하나의 행렬(matrix)이 주어지며, 이 행렬은 하나의 화면(screen)을 나타냅니다. 화면의 각 요소 (i, j)를 픽셀(pixel)이라고 부르고, 각 픽셀의 색상은 서로 다른 숫자로 표시합니다. 플러드 필 알고리즘에서는 선택된 픽셀이 기존 색상(prevColor)을 가지고 있을 때 그 픽셀을 새로운 색상(newColor)으로 채웁니다. 만약 픽셀의 색상이 기존 색상과 다르다면 해당 픽셀은 채우지 않습니다. 하나의 픽셀을 채운 뒤에는 위, 아래, 왼쪽, 오른쪽에 인접한 픽셀들에 대해 같은 작업을 반복 수행합니다.핵심 아이디어는

  8. 짝수를 두 소수의 합으로 표현하는 알고리즘

    4 이상의 모든 짝수는 두 개의 소수(Prime Number)의 합으로 표현할 수 있다는 것이 잘 알려져 있습니다. 이는 수학에서 유명한 골드바흐 추측(Goldbachs Conjecture)과 관련된 내용으로, 하나의 짝수가 여러 가지 소수 조합을 가질 수도 있다는 점이 흥미롭습니다.예를 들어 10은 다음과 같이 두 가지 방법으로 표현할 수 있습니다.10 = 5 + 510 = 7 + 3이 글에서 소개하는 알고리즘은 주어진 짝수에 대해 가능한 모든 소수 합의 조합을 찾아 출력합니다. 핵심 아이디어는 간단합니다. 어떤 수 x가 소수일

  9. 그레이엄 스캔(Graham's Scan) 알고리즘 — 볼록 껍질 경계점 찾기

    볼록 껍질(Convex Hull)이란?볼록 껍질(Convex Hull)은 주어진 모든 데이터 점들을 포함할 수 있는 가장 작은 닫힌 영역을 말합니다. 쉽게 비유하자면, 평면 위에 못을 박아 두고 고무줄을 팽팽하게 둘렀을 때 고무줄이 만드는 형태와 같습니다.그레이엄 스캔 알고리즘의 동작 원리그레이엄 스캔(Grahams Scan)은 볼록 껍질의 꼭짓점, 즉 경계점을 효율적으로 찾는 대표적인 기하학 알고리즘입니다. 시간 복잡도는 O(n log n)으로, 정렬 단계가 지배합니다.알고리즘은 다음 순서로 진행됩니다.시작점 선택: y좌표가 가장

  10. 자비스 행진(Jarvis March) 알고리즘 – 볼록 껍질 꼭짓점 찾기

    자비스 행진 알고리즘이란?자비스 행진(Jarvis March) 알고리즘은 주어진 데이터 포인트 집합에서 볼록 껍질(convex hull)의 꼭짓점을 찾아내는 대표적인 계산 기하학(computational geometry) 알고리즘입니다. 포장지로 물건을 감싸듯 외곽 점들을 따라가며 볼록 껍질을 만든다고 하여 선물 포장(Gift Wrapping) 알고리즘이라고도 불립니다.데이터 집합에서 가장 왼쪽에 있는 점을 시작점으로 정한 뒤, 반시계 방향으로 회전하면서 볼록 껍질에 포함되는 점들을 차례대로 찾습니다. 현재 점을 기준으로 나머지 점

  11. 배열에서 K번째로 큰 요소 찾기 – 정렬 기반 알고리즘과 C++ 구현

    이 알고리즘은 주어진 데이터 집합에서 가장 큰 요소부터 K번째로 큰 요소까지를 찾아내는 방법입니다.이 문제는 배열을 정렬하는 것만으로도 쉽게 해결할 수 있습니다. 배열을 오름차순 또는 내림차순으로 정렬할 수 있는데, 내림차순으로 정렬하면 앞쪽의 K개 요소가 곧바로 원하는 결과가 됩니다.입력과 출력입력:배열의 요소: {1, 23, 12, 9, 30, 2, 50, 63, 87, 12, 45, 21}, K = 4출력:가장 큰 4개의 요소는 87 63 50 45알고리즘kthLargestElement(array, n, k)입력: 배열, 배열

  12. DFA 기반 나눗셈 알고리즘 – 결정적 유한 오토마타로 나머지 구하기

    DFA 기반 나눗셈이란? 결정적 유한 오토마타(DFA, Deterministic Finite Automaton)는 어떤 수가 다른 수 k로 나누어 떨어지는지 판별하는 데 활용할 수 있습니다. 나누어 떨어지지 않는 경우에는 나머지 값까지 함께 구해 줍니다. DFA 기반 나눗셈을 수행하려면 먼저 DFA의 전이 테이블(transition table)을 작성해야 합니다. 이 테이블만 있으면 실제 나눗셈 연산 없이도 답을 쉽게 얻을 수 있습니다. DFA에서 각 상태는 입력 비트에 따라 0 또는 1, 단 두 가지 전이만 가진다는 점이 핵심입니

  13. N진수 덧셈 알고리즘과 C++ 구현 방법

    문제 개요이 문제에서는 두 개의 수가 주어지며, 두 수의 밑(진법)은 모두 n입니다. 목표는 두 수를 더한 결과를 역시 n진수 형태로 구하는 것입니다.가장 직관적인 해결 방법은 다음 세 단계로 진행하는 것입니다.주어진 n진수 두 개를 각각 10진수로 변환합니다.10진수 값끼리 단순히 더합니다.덧셈 결과를 다시 n진수로 변환하여 출력합니다.n진수는 문자열(string) 형태로 입력받습니다. 그 이유는 밑이 9보다 큰 진법에서는 한 자릿수를 표현하기 위해 알파벳이 필요하기 때문입니다. 대표적인 예로 16진수는 10~15에 해당하는 값을

  14. 바빌론 방법(Babylonian Method)으로 제곱근 구하기

    바빌론 방법(Babylonian Method)은 비선형 방정식을 풀기 위한 뉴턴-랩슨(Newton-Raphson) 방법에 기반한 수치 해석 기법 중 하나로, 제곱근을 계산할 때 사용됩니다. 고대 바빌로니아 시대부터 유사한 방식으로 제곱근이 계산되었다고 알려져 있으며, 이 때문에 바빌론 방법 또는 헤론의 방법(Herons Method)이라고도 불립니다.핵심 아이디어는 매우 간단합니다. 임의의 값 x와 1을 초기 추정값으로 설정한 뒤, x와 y의 평균을 다음 근사치로 삼습니다. 이후 y 값을 number / x로 갱신하고, 이 과정을

  15. 큰 수의 팩토리얼(계승) 계산 – 배열을 활용한 C++ 구현 방법

    왜 배열이 필요한가? 컴퓨터에서 변수는 메모리의 특정 공간에 저장되며, 그 크기는 고정되어 있습니다. 그래서 15!나 20!처럼 값이 큰 수의 팩토리얼(계승)을 계산하면 결과가 변수가 담을 수 있는 범위를 초과하는 오버플로우가 발생해 엉뚱한 값이 출력됩니다. 참고로 32비트 int형은 12!(약 47억 9천만)까지만 표현할 수 있으며, 13!부터는 이미 범위를 벗어납니다. 이 문제를 해결하려면 배열을 이용해 결과를 저장해야 합니다. 배열의 각 요소에는 결과 숫자의 한 자릿수씩을 나누어 담습니다. 단, 배열에는 곱셈 연산자를 바로 적

  16. 레이 캐스팅 알고리즘으로 주어진 점이 다각형 내부에 있는지 확인하는 방법

    문제 개요하나의 다각형과 한 점 P가 주어졌을 때, 이 점이 다각형의 내부에 있는지 아니면 외부에 있는지 판별하는 문제입니다. 컴퓨터 그래픽스, 지리 정보 시스템(GIS), 게임 충돌 판정 등 다양한 분야에서 자주 활용되는 기본적인 기하 알고리즘입니다.해결 아이디어: 레이 캐스팅(Ray Casting)이 문제는 레이 캐스팅(Ray Casting), 즉 광선 투사 기법으로 해결할 수 있습니다. 점 P에서 출발하여 무한히 뻗어나가는 수평선(x축에 평행한 반직선)을 하나 그리고, 이 선이 다각형의 변들과 몇 번 교차하는지 세는 것입니다.

  17. 완전 제곱수(퍼펙트 스퀘어) 판별 방법 - 알고리즘과 C++ 구현

    완전 제곱수란 무엇인가?어떤 수의 제곱근이 정수일 때, 그 수를 완전 제곱수(perfect square number)라고 부릅니다. 다시 말해, 제곱근을 씌웠을 때 소수점 없이 딱 떨어지는 정수가 나온다면 그 수는 완전 제곱수입니다. 예를 들어 16의 제곱근은 4이므로 16은 완전 제곱수이지만, 1032의 제곱근은 약 32.12로 정수가 아니기 때문에 완전 제곱수가 아닙니다.판별 원리완전 제곱수를 확인하는 가장 직관적인 방법은 해당 수의 제곱근을 반복적으로 계산하여 일치 여부를 비교하는 것입니다. 제곱근 값이 대상 수를 넘어서게 되

  18. 주어진 4개의 점이 정사각형을 형성하는지 확인하는 알고리즘

    2차원 평면 위에 네 개의 점이 주어졌을 때, 이 점들이 정사각형의 네 꼭짓점을 이루는지 판별하는 알고리즘입니다. 좌표 데이터를 수학적 조건 검증만으로 빠르고 정확하게 확인할 수 있습니다. 정사각형 판별 조건 주어진 네 점이 정사각형을 이루려면 다음 두 가지 조건을 모두 만족해야 합니다. 네 점으로 만들어지는 네 변의 길이가 모두 같아야 합니다. 서로 이웃한 두 변이 이루는 각이 모두 직각(90°)이어야 합니다. 입력과 출력 입력: 네 개의 점 {(20, 10), (10, 20), (20, 20), (10, 10)} 출력:

  19. 두 집합이 서로소(Disjoint Set)인지 확인하는 방법 – C++ 구현 예제

    서로소 집합(Disjoint Set)이란?두 집합이 서로소(disjoint)라는 것은 두 집합 사이에 공통 원소가 하나도 존재하지 않는다는 의미입니다. 다시 말해, 두 집합의 교집합을 구했을 때 결과가 공집합(∅)이 된다면 그 두 집합은 서로소 관계라고 할 수 있습니다.판별 방법은 매우 간단합니다. 이 알고리즘에서는 두 개의 집합이 주어지며, 두 집합이 이미 정렬되어 있다고 가정합니다. 이후 두 집합의 원소를 앞에서부터 순차적으로 비교하는데, 일치하는 원소가 하나라도 발견되면 서로소가 아니며, 끝까지 일치하는 원소가 없다면 두 집합

  20. 두 선분이 교차하는지 확인하는 기하 알고리즘 (C++ 구현)

    컴퓨터 그래픽스나 충돌 감지 등 다양한 분야에서 자주 등장하는 문제 중 하나는 두 선분이 서로 교차하는지 판별하는 것입니다. 첫 번째 선분의 양 끝점을 p1, p2라 하고, 두 번째 선분의 양 끝점을 q1, q2라고 할 때, 두 선분의 교차 여부를 효율적으로 확인할 수 있습니다.교차 조건두 선분이 교차한다고 판단할 수 있는 대표적인 조건은 다음과 같습니다.(p1, p2, q1)과 (p1, p2, q2)의 방향(orientation)이 서로 다르고,(q1, q2, p1)과 (q1, q2, p2)의 방향 역시 서로 다를 때여기서 방향이

Total 1478 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:64/74  20-컴퓨터/Page Goto:1 58 59 60 61 62 63 64 65 66 67 68 69 70