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

C++

  1. C++로 두 배열 비교하기: 첫 번째 배열에만 있는 요소 찾는 방법

    두 개의 배열 A와 B가 있다고 가정해 봅시다. 이때 배열 A에는 존재하지만 배열 B에는 없는 요소들을 찾아야 합니다. A와 B를 집합(set)으로 생각하면, 이 작업은 기본적으로 집합 차집합 연산과 같습니다. 즉, A와 B의 차집합을 구하면 원하는 요소들을 얻을 수 있습니다.C++에서는 <algorithm> 헤더에 포함된 std::set_difference 함수를 사용하면 이 작업을 간단하게 처리할 수 있습니다. 다만 이 함수를 사용하기 전에는 반드시 두 배열이 정렬되어 있어야 한다는 점에 유의해야 합니다.예제 코드#i

  2. C++에서 엑셀 열 번호를 열 문자(A, B, C…)로 변환하는 방법

    엑셀 열 문자의 규칙엑셀의 열 이름은 알파벳으로 구성됩니다. A부터 시작하여 Z까지 진행된 후, 다시 AA, AB 순으로 이어지며 ZZ에 도달하면 그다음은 AAA, AAB처럼 계속 확장됩니다. 즉, 1번 열은 A, 26번 열은 Z, 27번 열은 AA에 해당합니다. 이번 글에서는 열 번호가 주어졌을 때 해당하는 열 문자를 구하는 방법을 알아보겠습니다. 예를 들어 열 번호가 80이라면 결과는 CB가 됩니다.변환 알고리즘의 핵심 원리이 문제는 사실상 10진수를 26진법 형태의 문자로 바꾸는 과정과 유사합니다. 숫자 n이 주어지면 먼저 n

  3. C++에서 배열의 최솟값 빈도를 찾는 방법

    이 글에서는 배열에서 가장 작은 요소가 몇 번 나타나는지, 즉 최솟값의 빈도를 구하는 방법을 알아보겠습니다.예를 들어 배열이 [5, 3, 6, 9, 3, 7, 5, 8, 3, 12, 3, 10]이라고 가정해 봅시다. 이 배열에서 가장 작은 값은 3이며, 이 값은 총 4번 등장합니다. 따라서 프로그램의 출력 결과는 4가 됩니다.문제 해결 접근 방식이 문제는 두 단계로 간단하게 해결할 수 있습니다.1. 먼저 배열을 한 번 순회하며 최솟값을 찾습니다.2. 다시 배열을 순회하면서 해당 최솟값과 일치하는 요소의 개수를 세어 반환합니다.C++

  4. C++로 배열을 합이 같은 두 부분 배열로 나눌 수 있는지 확인하는 방법

    배열 A가 주어졌을 때, 이 배열을 두 부분으로 나누어 각 부분의 합이 서로 같아지도록 할 수 있는지 확인하는 문제입니다. 예를 들어 배열의 요소가 [6, 1, 3, 2, 5]라면, [6, 1]과 [2, 5]가 합이 같은 두 부분 배열이 될 수 있습니다.해결 아이디어이 문제는 다음 규칙에 따라 간단하게 해결할 수 있습니다.먼저 배열의 모든 요소를 더해 전체 합(total_sum)을 구합니다.배열의 각 요소를 순서대로 순회하면서 지금까지의 누적합(so_far_sum)을 관리합니다.각 위치에서 2 × so_far_sum + arr[i]

  5. C++에서 숫자 N을 k개의 수의 곱으로 표현할 수 있는지 확인하는 방법

    어떤 수 N과 또 다른 수 k가 주어졌을 때, N을 1보다 큰 k개의 수의 곱으로 표현할 수 있는지 확인하는 문제입니다. 예를 들어 N = 54, k = 3이라면 [2, 3, 9]와 같이 세 개의 수로 표현할 수 있습니다. 반면 표현이 불가능한 경우에는 그 사실을 출력해야 합니다.접근 방법이 문제는 소인수분해를 활용하여 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.N의 모든 소인수를 구하여 벡터(vector)에 저장합니다.1보다 큰 k개의 수를 만들 수 있는지 확인하기 위해 벡터의 크기가 k 이상인지 검사합니다.벡터의 크기

  6. C++ 이진 탐색으로 배열에서 특정 값에 가장 가까운 k개의 요소 찾기

    정렬된 배열 A와 두 개의 값 X, k가 주어졌을 때, 배열 A에서 X에 가장 가까운 k개의 요소를 찾는 것이 이 글의 목표입니다. 단, X 자체가 배열에 포함되어 있다면 그 값은 결과에서 제외해야 합니다.예를 들어 A = [12, 16, 22, 30, 35, 39, 42, 45, 48, 50, 53, 55, 56]이고 X = 35, k = 4라면, 출력 결과는 30, 39, 42, 45입니다.해결 접근 방식: 이진 탐색 활용이 문제는 이진 탐색(Binary Search)을 활용하면 효율적으로 해결할 수 있습니다. 먼저 이진 탐색으

  7. C++ 정렬되지 않은 배열에서 가장 가까운 k개의 숫자 찾는 방법

    문제 개요정렬되지 않은 배열 A가 주어져 있다고 가정해 봅시다. 여기에 두 개의 값 X와 k가 함께 주어지며, 우리의 목표는 배열 A에서 X에 가장 가까운 k개의 원소를 찾아내는 것입니다.단, 만약 X 자체가 배열에 포함되어 있다면 그 값은 결과에서 제외해야 합니다.예를 들어 다음과 같은 입력이 있다고 해보겠습니다.배열 A = [48, 50, 55, 30, 39, 35, 42, 45, 12, 16, 53, 22, 56]X = 35, k = 4이 경우 출력 결과는 30, 39, 42, 45가 됩니다. 이 네 숫자는 35와의 차이가 가

  8. C++에서 조건부 연산자 없이 배열의 최댓값 구하는 방법

    배열 A에 여러 개의 요소가 저장되어 있다고 가정해 보겠습니다. 이 배열에서 가장 큰 요소를 찾아야 하는데, 중요한 제약 조건이 하나 있습니다. 바로 조건부 연산자(if, 삼항 연산자 등)를 사용할 수 없다는 것입니다. 예를 들어 A = [12, 63, 32, 24, 78, 56, 20]이라면 결과는 78이 되어야 합니다.접근 방법: 비트 AND 연산 활용이 문제는 비트(bitwise) AND 연산을 활용하면 깔끔하게 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.먼저 배열 끝에 INT_MAX(모든 비트가 1로 채워진 값)를

  9. C++에서 문자열의 일부 문자를 삭제하여 만들 수 있는 사전의 최장 단어 찾기

    사전(단어 집합)과 하나의 문자열 s가 주어졌을 때, 문자열 s의 일부 문자를 삭제하여 만들 수 있는 사전 내 최장 단어를 찾는 것이 이번 문제의 목표입니다. 이때 중요한 조건은 삭제한 뒤 남은 문자들의 상대적인 순서가 그대로 유지되어야 한다는 점입니다. 즉, 답이 되는 단어는 반드시 문자열 s의 부분 수열(subsequence)이어야 합니다.예를 들어 문자열 s가 apbreoigroakml이고, 사전에 {prog, ram, program}이 저장되어 있다고 가정해 보겠습니다. 세 단어 모두 s의 부분 수열이 될 수 있지만, 그중

  10. C++ 재귀로 풀어보는 원형 배열 문제: 두 번째 요소마다 삭제한 후 마지막에 남는 수 찾기

    문제 개요1부터 n까지의 정수가 담긴 원형 배열(circular array)이 있다고 가정해 보겠습니다. 첫 번째 요소부터 시작해 매번 두 번째 요소를 차례대로 삭제할 때, 마지막까지 남게 되는 요소를 구하는 것이 이 글의 목표입니다.예를 들어 입력이 5라면 배열은 [1, 2, 3, 4, 5]가 됩니다. 1부터 시작해 두 번째 요소인 2를 삭제하고, 이어서 남은 요소 중 두 번째인 4를 삭제하는 방식으로 진행하면 다음과 같은 과정이 됩니다.1 0 3 4 51 0 3 0 50 0 3 0 50 0 3 0 0모든 삭제 과정이 끝난 후 배

  11. C++에서 문자열 내 문자의 마지막 인덱스를 찾는 방법

    문제 개요문자열 str과 문자 ch가 주어졌을 때, 문자열 안에서 ch가 마지막으로 등장하는 위치(인덱스)를 구해야 합니다. 예를 들어 문자열이 Hello이고 문자 ch = l이라면, l은 2번과 3번 위치에 존재하므로 마지막 인덱스는 3이 됩니다.접근 방법가장 직관적인 해결 방법은 문자열을 오른쪽에서 왼쪽으로 순회하는 것입니다. 현재 위치의 문자가 찾는 문자와 일치하지 않으면 인덱스를 하나씩 감소시키고, 일치하는 순간 반복을 멈추고 해당 인덱스를 반환합니다. 만약 끝까지 탐색했는데도 찾지 못했다면 -1을 반환하여 문자가 존재하지

  12. C++로 행렬의 각 열에서 최댓값 찾는 방법

    행렬(matrix)이 주어졌을 때, 각 열(column)에 포함된 요소들 중 가장 큰 값을 찾아 출력하는 것이 이번 글의 목표입니다. 접근 방법은 매우 간단합니다. 열을 하나씩 순회하면서 최댓값 변수를 초기화하고, 해당 열의 모든 행(row) 요소를 비교하여 가장 큰 값을 구한 뒤 출력하면 됩니다.알고리즘 동작 원리바깥쪽 반복문은 열 인덱스를 기준으로 진행되며, 안쪽 반복문은 해당 열의 첫 번째 행부터 마지막 행까지 요소를 하나씩 확인합니다. 현재까지의 최댓값보다 큰 요소가 발견되면 최댓값을 갱신하고, 한 열의 탐색이 끝나면 결과를

  13. C++로 행렬의 각 행에서 최댓값 찾는 방법

    행렬(matrix)이 주어졌을 때, 각 행에서 가장 큰 요소를 찾아 출력하는 문제를 살펴보겠습니다. 이 작업은 매우 간단합니다. 각 행마다 최댓값 변수를 초기화한 후, 해당 행의 모든 요소를 하나씩 비교하면서 더 큰 값이 나타나면 갱신하고, 행이 끝나면 그 값을 출력하면 됩니다.알고리즘 동작 원리핵심 로직은 다음과 같습니다.1. 바깥쪽 반복문으로 행렬의 각 행을 순회합니다.2. 각 행의 첫 번째 요소를 임시 최댓값으로 설정합니다.3. 안쪽 반복문으로 두 번째 요소부터 끝까지 탐색하며, 현재 최댓값보다 큰 요소가 있으면 값을 교체합니

  14. C++ 재귀 호출로 단일 연결 리스트의 중간 노드 찾기

    숫자로 구성된 단일 연결 리스트가 주어졌을 때, 재귀(Recursion)만을 이용해 리스트의 가운데 노드를 찾아보겠습니다. 예를 들어 리스트의 요소가 [12, 14, 18, 36, 96, 25, 62]라면, 정확히 가운데에 위치한 요소는 36입니다.동작 원리이 문제는 다음과 같은 절차로 해결할 수 있습니다.재귀 호출을 통해 리스트 끝까지 순회하면서 전체 노드 개수(n)를 셉니다.head가 NULL에 도달하면 n을 절반으로 나눕니다.재귀 호출이 되감기면서 각 단계마다 n을 1씩 감소시키고, n이 0이 되는 시점의 노드를 중간 노드로

  15. C++에서 숫자의 최상위 세트 비트(MSB) 값 찾는 방법

    개요이 글에서는 주어진 숫자에서 최상위 세트 비트(Most Significant Bit, MSB)의 값을 찾는 방법을 알아봅니다. MSB의 값은 항상 2의 거듭제곱 형태라는 점이 핵심입니다.예를 들어 숫자가 10이라면 이진수로 1010으로 표현되며, 가장 높은 자리에 있는 세트 비트의 값은 8(2³)입니다. 즉, 먼저 MSB의 위치 k를 구한 후, k번째 비트가 세트된 값인 2^k를 계산하면 원하는 결과를 얻을 수 있습니다.동작 원리1. log2(n) 함수를 사용하여 MSB의 위치 k를 구합니다.2. pow(2, k)를 사용하여 k

  16. C++에서 D로 나누어 떨어지는 N자리 숫자 찾기 방법

    두 개의 정수 N과 D가 주어졌을 때, D로 나누어 떨어지는 N자리 숫자를 찾아야 합니다. 예를 들어 N이 3이고 D가 5라면, 답은 500이 될 수 있습니다. 이 문제는 생각보다 간단하게 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다. D의 자릿수를 m이라고 할 때, D 뒤에 (N − m)개의 0을 붙이면 결과적으로 N자리 숫자가 되며, 이 숫자는 자연스럽게 D로 나누어 떨어집니다. 단, 예외적인 경우도 존재합니다. 만약 D가 10처럼 두 자리 이상인데 N이 1이라면, 한 자리 숫자 중에서 D로 나누어 떨어지는 수를 만들

  17. C++에서 주어진 조건을 만족하는 두 수 a와 b 찾기

    정수 n이 하나 주어졌다고 가정해 봅시다. 우리의 과제는 다음 세 가지 조건을 모두 만족하는 두 수 a와 b를 찾는 것입니다.a mod b = 0a * b > na / b < n조건을 만족하는 쌍이 존재하지 않으면 -1을 출력하면 됩니다.예를 들어 n = 10인 경우, a = 90, b = 10으로 선택하면 세 조건을 모두 만족합니다.90 mod 10 = 0 ✔90 × 10 = 900 > 10 ✔90 ÷ 10 = 9 < 10 ✔문제 해결 접근법이 문제는 복잡한 탐색 없이 간단한 수학적 관찰만으로 해결할 수 있습

  18. C++ 이진 탐색으로 정렬된 배열에서 한 번만 나타나는 요소 찾기

    문제 개요정렬된 배열 A가 주어졌다고 가정해 봅시다. 이 배열의 모든 요소는 두 번씩 나타나지만, 단 하나의 요소만 한 번만 등장합니다. 우리의 목표는 바로 이 고유한 요소를 찾아내는 것입니다.예를 들어 배열이 [1, 1, 3, 3, 4, 4, 5, 6, 6, 7, 7, 9, 9]라면, 한 번만 나타나는 요소는 5입니다.접근 방법: 이진 탐색배열이 정렬되어 있고 각 요소가 쌍을 이루고 있다는 특성을 활용하면, 선형 탐색(O(n)) 대신 이진 탐색(O(log n))으로 문제를 훨씬 효율적으로 해결할 수 있습니다.핵심 아이디어고유한 요

  19. C++에서 조건에 따라 반복적으로 변경될 때 X와 Y의 최종 값 구하기

    두 양의 정수 X와 Y의 초기값이 주어져 있습니다. 다음 규칙에 따라 값이 반복적으로 변경될 때, 최종적인 X와 Y의 값을 구하는 것이 목표입니다.1단계 − X = 0이고 Y = 0이면 프로세스를 종료하고, 그렇지 않으면 2단계로 이동합니다.2단계 − X ≥ 2Y이면 X = X − 2Y로 설정한 후 1단계로 돌아가고, 그렇지 않으면 3단계로 이동합니다.3단계 − Y ≥ 2X이면 Y = Y − 2X로 설정한 후 1단계로 돌아가고, 그렇지 않으면 프로세스를 종료합니다.X와 Y는 [0, 1018] 범위까지 가질 수 있으므로, 매번 2Y

  20. C++ 배열에서 첫 번째, 두 번째, 세 번째 최솟값 찾는 방법

    n개의 요소로 이루어진 배열이 있다고 가정해 보겠습니다. 이 배열에서 첫 번째, 두 번째, 세 번째 최솟값을 찾아야 합니다. 여기서 첫 번째 최솟값은 배열 전체에서 가장 작은 값이고, 두 번째 최솟값은 첫 번째 값보다 큰 수 중 가장 작은 값, 세 번째 최솟값은 두 번째 값보다 큰 수 중 가장 작은 값을 의미합니다.이 문제는 배열의 각 요소를 한 번씩 순회하면서, 현재 요소가 첫 번째, 두 번째, 세 번째 최솟값 조건에 해당하는지 차례로 검사하는 방식으로 해결할 수 있습니다.알고리즘 동작 원리세 개의 변수(first, sec, th

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:92/300  20-컴퓨터/Page Goto:1 86 87 88 89 90 91 92 93 94 95 96 97 98