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

C++

  1. C++로 소인수 거듭제곱의 GCD가 1인 범위 내 숫자 개수 구하기

    두 수 start와 end가 양의 정수 범위를 나타낼 때, 이 범위 [start, end] 안에 속한 숫자 중 소인수분해했을 때 각 소인수의 지수(거듭제곱)들의 최대공약수(GCD)가 1이 되는 숫자의 개수를 구하는 것이 목표입니다. 예를 들어 어떤 수가 2p × 3q × 5r … 형태로 소인수분해된다면, 지수 p, q, r …의 GCD는 반드시 1이 되어야 합니다. 예시로 이해하기 입력 예제 1 입력 – start = 1, end = 10 출력 – 소인수 거듭제곱의 GCD가 1인 숫자의 개수: 6 설명 – 해당하는 숫자는 다음과

  2. C++에서 엄격하게 증가하는 하위 배열 개수 계산하기

    정수 요소로 이루어진 배열이 주어졌을 때, 먼저 배열에서 만들 수 있는 모든 하위 배열(subarray)을 구한 뒤, 각 하위 배열의 요소들이 엄격하게 증가하는 순서(strictly increasing order)를 이루는지 확인해야 합니다. 조건을 만족하는 하위 배열만 카운트하고, 그렇지 않은 하위 배열은 버립니다.여기서 핵심 아이디어는 하위 배열의 앞쪽 두 요소(0번째와 1번째 위치)부터 이미 증가하지 않는다면, 더 이상 해당 하위 배열을 검사하지 않고 바로 중단하는 것입니다. 이를 통해 불필요한 연산을 줄일 수 있습니다.예시입

  3. C++로 문자열 속 아나그램 출현 횟수 계산하기

    텍스트 스트림과 하나의 단어가 입력으로 주어졌을 때, 주어진 텍스트 안에서 해당 단어의 아나그램이 몇 번 등장하는지 찾아내는 것이 이번 문제의 목표입니다. 아나그램(anagram)은 단어를 구성하는 글자들을 재배열하여 만들어진 다른 단어나 문구를 의미합니다. 예를 들어 New York Times의 글자들을 재배열하면 Monkeys write라는 문구를 만들 수 있습니다. 예시 입력: 문자열 string-: workitwrokoffowkr, word = work 출력: 문자열 내 아나그램 출현 횟수: 3 설명: work로 만들 수 있

  4. C++로 주어진 문자열의 겹치지 않는 회문 부분 문자열 쌍 개수 구하기

    문자열이 입력으로 주어졌을 때, 이 문자열에서 겹치지 않는(non-overlapping) 회문 부분 문자열 쌍의 개수를 구하는 것이 목표입니다. 2차원 배열 arr[i][j]의 값은 i부터 j까지의 부분 문자열이 회문이면 true, 그렇지 않으면 false가 됩니다. 문자열에서 가능한 조합을 하나씩 만들어 보고, 각 쌍이 조건을 충족하는지 확인하는 방식으로 문제를 해결할 수 있습니다. 예제로 이해하기 입력: ABC 출력: 겹치지 않는 회문 부분 문자열 쌍의 개수는 3 설명: 가능한 쌍은 (A)(B)(C), (A)(BC), (AB)(

  5. C++로 문자 하나를 제거한 후 두 문자열 중 하나와 같아지는 경우의 수 구하기

    서로 다른 두 문자열 s1과 s2가 주어졌을 때, 어느 한쪽에서 문자를 정확히 하나 제거하여 다른 쪽 문자열과 같아지는 경우의 수를 구하는 것이 이 문제의 목표입니다.예시입력 - string S1 = utter, string S2 = butter;출력 - 한 글자를 제거한 후 두 문자열 중 하나와 같아지는 경우의 수: 1설명 - S2(butter)에서 문자 b를 제거하면 utter가 되어 S1과 완전히 같아집니다. 따라서 가능한 경우의 수는 1입니다.입력 - string S1 = fat, string S2 = rat;출력 - 한 글

  6. C++로 특정 범위에서 0이 아닌 자릿수가 K개 이하인 수의 개수 구하기

    정수 범위의 시작 값(start)과 끝 값(end), 그리고 정수 k가 주어졌을 때, 이 범위에 속한 수 중에서 0이 아닌 숫자(non-zero digit)의 개수가 k개를 초과하지 않는 수가 몇 개인지 계산하는 것이 이번 문제의 목표입니다.문제 예제입력 - int start = 50, end = 100, K = 2;출력 - 범위 내에서 0이 아닌 숫자가 K개를 초과하지 않는 수의 개수: 50설명 - 범위는 50부터 100까지이며 k는 2로 주어졌습니다. 50~99 사이의 모든 수는 두 자리 수이므로 0이 아닌 숫자가 3개 이상일

  7. C++로 풀기: 범위 내에서 m으로 나누어떨어지고 짝수 자릿수에 숫자 d를 포함하는 수의 개수 구하기

    정수 범위(start~end)와 나누는 수(m), 그리고 확인하고자 하는 숫자(d)가 주어졌을 때, 해당 범위 안에서 m으로 나누어떨어지면서 동시에 짝수 자릿수에 숫자 d를 포함하는 수의 개수를 계산하는 것이 이번 글의 목표입니다.단순히 범위 전체를 하나씩 검사하는 방법도 가능하지만, 범위가 커지면 비효율적입니다. 따라서 이 글에서는 각 자릿수를 한 단계씩 결정해 나가는 디지트 DP(Digit DP) 기법과 메모이제이션을 활용해 효율적으로 문제를 해결합니다.예제예제 1입력 - int start = 20, end = 50, d = 8

  8. C++ 자릿수 DP로 범위 내 숫자 d가 정확히 K번 등장하는 수의 개수 구하기

    시작 값(start)부터 끝 값(end)까지의 정수 범위와 두 변수 k, d가 주어졌을 때, 해당 범위 안에서 숫자 d가 정확히 k번 등장하는 수의 개수를 구하는 것이 이번 문제의 목표입니다. 이 문제는 자릿수 DP(Digit DP) 기법을 활용하면 효율적으로 해결할 수 있습니다. 예시 입력 - int start = 10, int end = 100, d = 4, K = 2 출력 - 숫자 d가 정확히 K번 등장하는 범위 내 수의 개수: 1 설명 - 범위는 10부터 100까지입니다. 이 범위에서 숫자 4가 정확히 2번 등장하는 수는 4

  9. C++에서 다른 이진 문자열과 XOR 결과가 0이 되는 순환 순열의 개수 구하기

    1과 0으로만 구성된 두 개의 이진 문자열 str_1과 str_2가 주어집니다. 해야 할 작업은 먼저 str_2에서 만들 수 있는 서로 다른 순환 순열들의 집합(SET)을 구성한 뒤, 집합의 각 원소를 문자열 str_1과 XOR 연산하고 그 결과가 0이 되는지 확인하는 것입니다. 결과가 0이라면 해당 경우를 카운트하고, 그렇지 않다면 무시합니다. 예제로 이해해 보기 입력 - string str_1 = 1111, string str_2 = 1111 출력 - 다른 이진 문자열과 XOR 결과가 0이 되는 순환 순열의 개

  10. C++로 연속된 요소의 값이 서로 다른 배열 개수 구하기

    문제 정의세 개의 변수 size(배열의 크기), max_val(요소가 가질 수 있는 최댓값), last_element(마지막 요소)가 입력으로 주어졌을 때, 다음 조건을 모두 만족하는 서로 다른 배열의 개수를 구하는 것이 목표입니다.배열은 정확히 size개의 요소로 구성됩니다.모든 요소는 1부터 max_val 사이의 값이어야 합니다.첫 번째 요소는 항상 1입니다.마지막 요소는 항상 last_element입니다.연속된 두 요소의 값은 서로 달라야 합니다.예시로 이해하기예시 1입력: size = 5, max_val = 3, last_e

  11. C++에서 총 가중치가 정확히 X이고 가중치 M인 간선을 하나 이상 포함하는 경로의 수 계산하기

    이번 문제에서는 무한한 깊이를 가질 수 있는 트리가 주어집니다. 노드가 가질 수 있는 자식의 수를 저장하는 변수 child, 경로에 부여되는 가중치를 나타내는 변수 weight, 그리고 목표 총 가중치(X)를 저장하는 변수 path가 함께 제공됩니다. 우리의 과제는 총 가중치가 정확히 X와 같으면서, 가중치 M을 가진 간선을 적어도 하나 이상 포함하는 경로의 개수를 계산하는 것입니다. 예시 입력 - int child = 4, weight = 4, path = 4; 출력 - 총 가중치가 정확히 X이고 가중치 M인 간선을 하나 이상 포

  12. C++ 2D 문자 배열에서 주어진 문자열 개수 세기

    다음 문제는 신문의 일일 십자말풀이에서 볼 수 있는 유형의 예제입니다. 2차원 문자 배열(미로)이 주어졌을 때, 그 안에서 주어진 단어를 찾아내는 것이 문제입니다. 탐색 알고리즘은 위에서 아래로, 오른쪽에서 왼쪽으로 그리고 그 반대 방향으로 개별 문자를 찾되, 대각선 방향은 제외합니다.예제로 이해하기입력 - 찾을 문자열 word: LAYS2D 문자열 배열 - { LOAPYS, KAYSOT, LAYSST, MLVAYS, LAYSAA, LAOYLS };출력 - 2D 문자 배열에서 주어진 문자열의 개수: 7설명 - 문자열 배열이 주어지면

  13. C++로 배열에서 등차수열(AP) 부분 수열 개수 구하기

    정수 요소로 이루어진 배열 arr[]가 주어졌을 때, 우리의 목표는 arr[] 안에서 만들 수 있는 등차수열(Arithmetic Progression, AP) 부분 수열의 개수를 세는 것입니다. 배열에 들어갈 수 있는 요소의 값 범위는 [1, 1000000]입니다. 여기서 중요한 점은 빈 수열이나 원소가 하나뿐인 수열도 등차수열로 간주하여 개수에 포함한다는 사실입니다. 예제로 이해하기 예시 1 입력 - arr[] = {1,2,3} 출력 - 배열에서 등차수열(AP) 부분 수열의 개수: 8 설명 - 다음 부분 수열들이 등차수열을 이룹

  14. C++에서 'ab' 부분 문자열을 모두 제거한 후 남는 최종 문자열 구하기

    이 튜토리얼에서는 다음과 같은 문제를 해결해 보겠습니다.a와 b 문자로만 이루어진 문자열이 주어졌을 때, 문자열에서 ab 부분 문자열을 모두 제거하고 남은 문자열을 출력하는 것이 우리의 과제입니다.문제 해결 아이디어이 문제를 해결하는 핵심 아이디어는 매우 간단합니다. a와 b로만 구성된 문자열은 ab를 반복해서 제거하다 보면 결국 a 또는 b 중 하나로만 수렴하게 됩니다.예를 들어 abab라는 문자열이 있으면, ab를 한 번 제거하면 ab가 되고, 다시 제거하면 빈 문자열이 됩니다. 반면 aab라면 ab를 제거한 후 a가 남습니다.

  15. C++에서 매우 큰 수의 거듭제곱 나머지 (a^b)%m 구하기

    개요이 튜토리얼에서는 a가 매우 큰 숫자일 때 (ab)%m을 구하는 방법을 알아보겠습니다. 여기서 a는 일반적인 정수 자료형에 담을 수 없을 만큼 크기 때문에 문자열 형태로 주어진다고 가정합니다.모듈러 연산의 성질을 활용하면 이 문제를 간단히 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.(ab)%m = ((a%m) × (a%m) × ... )%m  (b번 반복)즉, 먼저 a%m 값을 구한 뒤, 그 결과를 b번 곱하면서 매번 m으로 나머지 연산을 적용하면 오버플로우 없이 정답을 얻을 수 있습니다.해결 접근 방법숫자

  16. C++로 약수 배열에서 두 수 A와 B 찾기: 알고리즘과 구현 방법

    이 튜토리얼에서는 정수 배열이 주어졌을 때 두 개의 수 A와 B를 찾는 문제를 해결해 보겠습니다.문제의 조건은 다음과 같습니다.배열에 있는 나머지 모든 수는 A 또는 B의 약수입니다.어떤 수가 A와 B 양쪽의 공약수라면, 그 수는 배열에 두 번 등장합니다.문제 해결 접근 방식핵심 아이디어는 배열에서 가장 큰 값을 활용하는 것입니다.배열의 최댓값은 A 또는 B 중 하나입니다. 편의상 이 값을 A라고 하겠습니다. 어떤 수의 약수는 그 수 자신보다 클 수 없기 때문에, 배열 전체가 A와 B의 약수들로만 구성되어 있다면 최댓값은 반드시 A

  17. C++에서 재귀 함수로 2^(2^A) % B 값 구하기

    이 튜토리얼에서는 수식 2^(2^A) % B의 값을 계산하는 프로그램을 작성해 보겠습니다.2^(2^A)처럼 지수가 기하급수적으로 커지는 경우, 실제 거듭제곱 값을 직접 계산하는 것은 불가능합니다. 하지만 다음과 같은 수학적 관계를 활용하면 재귀 함수를 통해 효율적으로 나머지 값을 구할 수 있습니다.2^(2^A) = (2^(2^(A-1)))^2즉, 한 단계 아래의 결과를 제곱하고 B로 나눈 나머지를 취하면 되므로, 모듈러 연산의 성질 덕분에 오버플로우 없이 계산할 수 있습니다.문제 해결 절차A와 B 두 개의 인자를 받는 재귀 함수를

  18. C++로 (1ⁿ + 2ⁿ + 3ⁿ + 4ⁿ) mod 5 빠르게 구하는 방법

    이번 튜토리얼에서는 다음과 같은 문제를 함께 해결해 보겠습니다.정수 n이 주어졌을 때, (1n + 2n + 3n + 4n) % 5의 값을 구하는 것입니다.왜 직접 계산할 수 없을까?n이 조금만 커져도 (1n + 2n + 3n + 4n)의 값은 기하급수적으로 폭발적으로 증가합니다. 실제로 이 값은 long long 자료형의 범위조차 쉽게 초과해 버리기 때문에, 거듭제곱을 직접 계산한 뒤 나머지를 구하는 단순한 방식으로는 해결할 수 없습니다. 따라서 수학적 패턴을 찾아내는 접근이 필요합니다.패턴 찾기n = 1부터 9까지 식을 직접 계산

  19. C++ 배열에서 고정점(Fixed Point) 찾기: 인덱스와 값이 같은 원소 구하기

    문제 소개 이번 튜토리얼에서는 다음과 같은 문제를 함께 해결해 보겠습니다. 주어진 배열에서 인덱스와 값이 동일한 숫자, 즉 고정점(Fixed Point)을 찾는 것입니다. 고정점은 함수 관점에서 f(x) = x를 만족하는 지점을 뜻하며, 배열에 적용하면 arr[i] == i가 성립하는 인덱스 i를 의미합니다. 접근 방법 가장 직관적인 해결 방법은 선형 탐색(linear search)입니다. 배열의 처음부터 끝까지 차례대로 순회하면서 현재 인덱스와 그 위치의 요소 값이 일치하는지 확인하고, 조건을 만족하는 첫 번째 인덱스를 반환하면

  20. C++에서 가장 많은 배열 요소로 나누어 떨어지는 숫자 찾기

    소개 이 튜토리얼에서는 주어진 배열에서 가장 많은 배열 요소로 나누어 떨어지는 숫자를 찾는 방법을 알아봅니다. 즉, 배열 내 요소들에 의해 가장 많이 나누어지는 요소가 몇 개의 요소로 나누어지는지 그 최대 개수를 구하는 것입니다. 문제를 해결하는 단계는 다음과 같습니다. 배열과 결과값을 저장할 변수를 초기화합니다. 배열을 순회합니다. 카운터 변수를 초기화합니다. 배열을 다시 한 번 순회합니다. 현재 요소가 해당 배열 요소로 나누어 떨어지면 카운터를 1 증가시킵니다. 현재 카운트가 지금까지의 최댓값보다 크면 결과를 갱신합니다

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:252/300  20-컴퓨터/Page Goto:1 246 247 248 249 250 251 252 253 254 255 256 257 258