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

C++

  1. C++에서 합이 N이 되도록 하는 한 자리 소수의 최소 개수 구하기

    이 글에서는 주어진 숫자 N의 합을 만들기 위해 필요한 한 자리 소수(2, 3, 5, 7)의 최소 개수를 구하는 방법을 다룹니다. 동적 계획법(Dynamic Programming)을 활용하면 효율적으로 문제를 해결할 수 있습니다. 문제 설명 한 자리 소수인 2, 3, 5, 7을 여러 번 사용하여 그 합이 정확히 N이 되도록 할 때, 필요한 소수의 최소 개수를 구하는 것이 목표입니다. 만약 어떤 조합으로도 N을 만들 수 없다면 -1을 반환해야 합니다. 예시 N = 9인 경우를 살펴보겠습니다. 7 + 2 = 9이므로 두 개의 소수(7과

  2. C++로 구하는 최소 무제곱 약수 개수

    문제 설명정수 N이 주어졌을 때, 제곱 인수가 없는 약수(무제곱 약수)의 최소 개수를 구하는 것이 목표입니다.여기서 N의 인수분해 결과는 반드시 완전제곱수가 아닌 약수들로만 구성되어야 합니다.예시예를 들어 N = 24라면, 다음과 같이 3개의 무제곱 인수로 분해할 수 있습니다.인수 = 2 × 6 × 2각 인수 2, 6, 2는 모두 완전제곱수가 아니므로 조건을 만족하며, 이 경우가 가능한 최소 개수입니다.알고리즘 접근 방법√N 이하의 모든 소수를 먼저 찾습니다.√N 이하의 각 소수에 대해, 해당 소수가 N에서 가지는 최대 지수를 구합

  3. C++로 풀어보는 마지막 몬스터의 최소 체력 문제 – GCD 활용법

    문제 설명 N마리의 몬스터가 주어지며, 각 몬스터는 정수 형태의 초기 체력 h[i]를 가집니다. 체력이 0보다 큰 몬스터는 생존 상태로 간주됩니다. 매 턴마다 한 몬스터가 다른 몬스터를 무작위로 공격하며, 공격당한 몬스터의 체력은 공격한 몬스터의 체력만큼 감소합니다. 이 과정은 단 한 마리의 몬스터만 남을 때까지 반복됩니다. 이때 마지막까지 살아남은 몬스터의 최소 가능 체력은 얼마일까요? 예시 입력 배열이 {2, 14, 28, 56}이라면 출력 결과는 2입니다. 첫 번째 몬스터(체력 2)가 나머지 세 몬스터를 계속해서 공격하면,

  4. C++ 배열을 균등하게 분할하기 위해 삽입해야 하는 최소 양의 정수 찾기

    문제 개요N개의 양의 정수로 이루어진 배열이 주어졌을 때, 배열의 임의의 두 원소 사이에 삽입할 수 있는 가장 작은 양의 정수를 찾는 것이 과제입니다. 이 정수를 삽입한 후, 앞쪽 부분 배열의 합과 뒤쪽 부분 배열의 합이 서로 같아져야 하며, 새로 삽입된 정수는 두 부분 배열 중 어느 쪽에 포함되어도 무방합니다.예시배열이 arr = {3, 2, 1, 5, 7, 10}이라면 출력값은 6입니다. 값 6을 5와 7 사이에 삽입하면 왼쪽 부분 배열과 오른쪽 부분 배열의 합이 다음과 같이 같아집니다.왼쪽 합: 3 + 2 + 1 + 5 + 6

  5. C++에서 |ai + aj − k|의 최솟값과 해당 쌍의 개수 구하기

    문제 설명정수 n개로 이루어진 배열과 하나의 정수 K가 주어집니다. 이때 i ≠ j를 만족하는 모든 순서 없는 쌍 {i, j} 중에서 |ai + aj − k|의 절댓값이 최소가 되는 쌍의 총 개수를 구하는 것이 목표입니다.예시배열이 arr[ ] = {0, 4, 6, 2, 4}이고 k = 7이라고 가정해 보겠습니다. 이 경우 최솟값 1을 만족하는 다음과 같은 5개의 쌍을 찾을 수 있습니다.{0, 6}, {4, 2}, {4, 4}, {6, 2}, {2, 4}알고리즘가능한 모든 쌍을 순회하면서 각 쌍에 대해 (ai + aj − k)의 값

  6. C++에서 X = P*A + Q*B로 표현 가능한 최소 양의 정수 X 구하기

    문제 설명두 정수 A와 B가 주어졌을 때, 다음 식을 만족하는 최소 양의 정수 X를 구하는 문제입니다.X = P*A + Q*B여기서 P와 Q는 0을 포함하여 임의의 양의 정수 또는 음의 정수 값을 가질 수 있습니다.예시A = 2, B = 4라고 할 때, 답은 2입니다.접근 방법이 문제는 베주 항등식(Bézouts identity)을 이용하면 간단히 해결할 수 있습니다. 베주 항등식에 따르면, P*A + Q*B 형태로 표현할 수 있는 최소 양의 정수 값은 바로 A와 B의 최대공약수(GCD)와 같습니다.따라서 복잡한 탐색 없이 A와 B

  7. C++ 알고리즘 풀이 – 게임에서 승리하는 데 필요한 최소 플레이어 수 구하기

    문제 설명 N개의 질문과 각 질문마다 K개의 선택지가 주어집니다(1 ≤ N ≤ 10⁹, 1 ≤ K ≤ 10⁹). 게임에서 반드시 승리하기 위해, 각 질문 i(1 ≤ i ≤ N)에 도전한 플레이어 수의 총합을 구해야 합니다. 단, 이 총합은 가능한 한 최소가 되어야 하며, 최종 답은 10⁹+7로 나눈 나머지로 출력해야 합니다. 여기서 중요한 조건은 한 번이라도 오답을 고르면 해당 플레이어는 즉시 탈락한다는 점입니다. 따라서 어떤 선택지가 정답이더라도 놓치지 않도록 충분한 인원을 배치해야 합니다. 예시 N = 5, K = 2인 경우

  8. C++로 구현하는 최소 집합 분할 문제: 합이 주어진 값 이하가 되도록 최대 2개씩 묶기

    문제 정의양의 정수로 이루어진 배열 arr[]이 주어졌을 때, 아래 조건을 모두 만족하도록 배열을 나누는 최소한의 집합(set) 개수를 구하는 것이 목표입니다.하나의 집합에는 최대 2개의 원소만 포함할 수 있으며, 두 원소는 반드시 인접해 있을 필요는 없습니다.집합에 속한 원소들의 합은 주어진 값(key) 이하여야 합니다. 편의상 key는 항상 배열의 최댓값보다 크거나 같다고 가정합니다.예시배열이 arr[] = {1, 2, 3, 4}이고 k = 5라고 가정해 보겠습니다. 이 경우 다음과 같이 2개의 집합으로 나눌 수 있습니다.{1,

  9. C++로 배열 전체의 XOR을 0으로 만드는 최소 연산 횟수 구하기

    문제 개요 n개의 요소로 이루어진 배열이 주어졌을 때, 배열 전체의 XOR 값을 0으로 만드는 것이 목표입니다. 이를 위해 다음과 같은 작업을 수행할 수 있습니다. 먼저 배열에서 임의의 요소 하나를 선택한 뒤, 선택한 요소의 값을 1씩 증가시키거나 감소시킬 수 있습니다. 배열 전체의 XOR 합이 0이 되도록 만들기 위해 선택한 요소에 적용해야 하는 최소 증가/감소 연산 횟수를 구해야 합니다. 예제 예를 들어 arr[] = {2, 4, 7}이라면 연산은 단 1번만 필요합니다. 요소 2를 선택합니다. 값을 1 증가시켜 3으로 만

  10. C++로 집합의 MEX를 x로 만드는 최소 연산 횟수 구하기

    문제 설명n개의 정수로 이루어진 집합이 주어졌을 때, 원소를 삽입하거나 삭제하는 연산을 최소 횟수만큼 수행하여 집합의 MEX가 주어진 값 x와 같아지도록 만드는 것이 목표입니다.참고 − 정수 집합의 MEX(Minimum EXcluded)란 해당 집합에 존재하지 않는 가장 작은 음수가 아닌 정수를 의미합니다. 예를 들어 집합 {0, 2, 4}의 MEX는 1이며, 집합 {1, 2, 3}의 MEX는 0입니다.예시n = 5, x = 3이고 배열이 {0, 4, 5, 6, 7}이라면, 필요한 최소 연산 횟수는 2번입니다.접근 방법 및 알고리즘

  11. C++로 이진 행렬의 모든 요소를 1로 만드는 최소 연산 횟수 구하기

    문제 개요N행 M열로 이루어진 이진 행렬(0과 1만 포함)이 주어집니다. 이 행렬에 허용되는 연산은 임의의 인덱스 (x, y)를 선택하여, 왼쪽 상단 모서리가 (0, 0)이고 오른쪽 하단 모서리가 (x-1, y-1)인 직사각형 영역 내의 모든 요소를 뒤집는(toggle) 것입니다. 여기서 뒤집기란 1을 0으로, 0을 1로 바꾸는 것을 의미합니다.목표는 행렬의 모든 요소를 1로 만드는 데 필요한 최소 연산 횟수를 구하는 것입니다.예시입력 행렬: {0, 0, 0, 1, 1} {0, 0, 0, 1, 1} {0, 0, 0, 1, 1} {1

  12. Go vs C++: 개발자가 알아야 할 11가지 핵심 차이점

    새로운 프로젝트를 시작할 때 프로그래밍 언어 선택은 매우 중요한 결정입니다. 시스템 프로그래밍 분야에서 많이 비교되는 Go와 C++는 각각 뚜렷한 철학과 특징을 가지고 있습니다. 이 글에서는 두 언어의 기본 개념과 주요 차이점을 표로 정리해 살펴보겠습니다. Go란? Go는 Google에서 개발한 절차적(procedural) 프로그래밍 언어입니다. 프로그램은 패키지 단위로 구성되며, 동적 언어와 유사한 패턴을 지원해 간결하고 생산적인 개발 경험을 제공합니다. 컴파일 속도가 빠르고 문법이 단순하여 대규모 서비스 개발에 널리 활용되고 있

  13. C++로 작성하는 해피 여성의 날 축하 프로그램

    전 세계적으로 기념되는 여성의 날을 맞아, C++ 프로그래밍 언어로 축하 도형과 메시지를 출력하는 프로그램을 만들어 보았습니다. 이 코드는 콘솔 화면에 # 문자로 이루어진 원 안에 7 Oct와 Happy Womens Day라는 문구를 함께 출력해, 텍스트 기반의 특별한 축하 카드를 완성합니다.코드 예제아래 코드는 두 부분으로 구성되어 있습니다. 첫 번째 루프는 원 형태의 상단 디자인을 출력하고, 두 번째 루프는 세로 줄과 가로 줄로 이루어진 하단 패턴을 그려냅니다.#include <iostream> using namesp

  14. C++에서 문자열의 모든 문자 대소문자 변환하기

    이 프로그램은 문자열에 포함된 모든 문자를 대소문자 반대 형태로 변환합니다. 즉, 대문자는 소문자로, 소문자는 대문자로 바꾸는 작업입니다. 사실 C++ 표준 라이브러리의 toupper(), tolower() 함수를 활용하면 손쉽게 구현할 수 있지만, 이 글에서는 각 문자의 ASCII 값을 직접 계산하여 변환하는 방법을 다룹니다.알고리즘START Step-1: char 배열을 선언한다. Step-2: 대문자인지 확인한다 — ASCII 값이 A(65) 이상이고 Z(90) 이하인 경우 Step-3: 소문자인지 확인한

  15. C++로 행렬의 상단 대각선과 하단 대각선 서로 바꾸는 방법

    이 튜토리얼에서는 C++ 코드를 사용하여 3x3 행렬(삼중 대각 배열)의 위쪽 삼각형 부분을 아래쪽 삼각형 부분과 맞바꾸는 방법을 다룹니다. 행렬이 입력으로 주어졌을 때, 우리가 원하는 결과는 아래와 같습니다.즉, 주대각선을 기준으로 오른쪽 위에 있는 요소들과 왼쪽 아래에 있는 요소들의 위치를 서로 교환하는 것입니다. 이 작업은 사실상 행렬의 전치(transpose)와 동일한 원리로 수행됩니다.알고리즘전체 과정은 다음 알고리즘과 같이 정리할 수 있습니다.1단계: 대각 행렬을 입력받는다2단계: Swap() 함수에 전달한다3단계: 외부

  16. C++ 문자열 at() 메서드 완벽 가이드 – 특정 위치의 문자 안전하게 접근하기

    개요이 튜토리얼에서는 C++ 문자열(String) 클래스의 at() 메서드를 활용해 문자열 내 특정 위치의 문자에 접근하는 방법을 다룹니다. 이어지는 섹션에서는 실제 프로그래밍 예제를 통해 at() 함수의 동작 원리와 활용법을 자세히 살펴보겠습니다.C++ 문자열(String) 클래스란?프로그래밍에서 문자열(string)이란 일반적으로 큰따옴표로 표현되는 문자들의 집합을 의미합니다. C++의 string 클래스는 컨테이너(container) 클래스이기도 하며, 반복자(iterator)나 [] 연산자를 사용해 문자열의 모든 문자를 순회

  17. C++ 프로그래밍에서 제곱근 계산하기: sqrt, sqrtl, sqrtf 함수 완벽 가이드

    C++ 수학(Math) 클래스 이 글에서는 C++ 수학(Math) 클래스의 핵심 함수인 sqrt(), sqrtl(), sqrtf()를 사용하여 각각 double, long double, float 타입 변수의 제곱근을 높은 정밀도로 계산하는 방법을 살펴봅니다. C++의 수학 클래스는 sin, cos, 제곱근, ceil, floor 등 다양한 수학 연산 함수를 폭넓게 제공하며, 이러한 계산 메서드들을 모두 활용하려면 프로그램에 반드시 <cmath> 헤더 라이브러리를 포함해야 합니다. sqrt() 함수 수학 클래스의 sq

  18. C++에서 문자열의 공백을 하이픈으로 바꾸는 방법

    C++ 프로그래밍에서는 문자열에 포함된 공백을 하이픈(-)으로 바꿔야 하는 경우가 종종 있습니다. 예를 들어 URL 슬러그 생성, 파일명 정규화, 데이터 전처리 등의 작업에서 이런 변환이 유용하게 활용됩니다.이 프로그램은 다음과 같은 순서로 동작합니다. 먼저 std::string 클래스의 length() 함수를 사용해 문자열의 전체 길이를 구한 뒤, 반복문으로 문자열을 한 글자씩 순회하면서 공백( )을 발견하면 해당 위치를 하이픈(-)으로 교체합니다.예제 코드#include <cstring> #include <ios

  19. C++에서 스택을 활용해 연결 리스트 반전하기

    개요 연결 리스트(Linked List)는 각 노드가 데이터와 다음 노드를 가리키는 포인터로 구성되며, 필요할 때마다 메모리를 동적으로 할당하는 자료 구조입니다. 흥미롭게도 이러한 연결 리스트는 스택을 구현하는 데에도 활용할 수 있습니다. 이 글에서는 스택의 LIFO(Last In First Out, 후입선출) 특성을 활용하여 C++로 연결 리스트를 반전시키는 방법을 알아봅니다. 알고리즘 연결 리스트를 반전하기 위해 다음과 같은 절차를 따릅니다. START Step 1: node 포인터 타입의 빈 스택을 생성한다

  20. C++에서 문자열의 특정 단어를 별표(*)로 바꾸는 방법

    C++ 프로그래밍에서 문자열에 포함된 특정 단어를 별표(*)로 대체하는 기능은 게시판 검열, 민감 정보 마스킹 등 실무에서 폭넓게 활용됩니다. 이 프로그램은 vector 클래스와 string 클래스의 핵심 기능을 활용해 원하는 결과를 손쉽게 얻도록 구성되어 있습니다.알고리즘START Step 1: 문자열을 입력받는다. Step 2: 문자열을 단어 단위로 분리하여 벡터(vector)에 저장한다. Step 3: 대체할 단어의 길이만큼 반복하며 별표(*)를 변수에 누적한다. Step 4: 벡터를 순회하며 각

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:96/300  20-컴퓨터/Page Goto:1 90 91 92 93 94 95 96 97 98 99 100 101 102