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

C++

  1. C++로 풀기: '?'를 활용해 원점에서 도달 가능한 최대 거리 구하기

    문제 설명L, R, ? 세 가지 문자로만 이루어진 문자열 s가 주어집니다. L은 왼쪽으로 한 칸 이동, R은 오른쪽으로 한 칸 이동을 의미하며, ?는 L 또는 R 중 어느 쪽이든 자유롭게 선택할 수 있는 자리입니다. 위치 0에서 출발할 때, ?를 적절히 L 또는 R로 바꿔서 원점(0)에서 도달할 수 있는 최대 거리를 구하는 것이 목표입니다.예를 들어 입력이 LLRRL??라면 출력은 3이 됩니다. 두 개의 ?를 모두 L로 바꾸면 왼쪽으로 5칸, 오른쪽으로 2칸 이동하게 되어 최종 변위는 |5 − 2| = 3입니다.접근 방법이 문제의

  2. C++로 풀어보는 뒤집힌 행렬 문제: 행과 열을 뒤집어 1의 최대 개수 구하기

    문제 개요하나의 이진 행렬(0과 1로만 구성된 행렬)이 주어졌다고 가정해 보겠습니다. 우리가 구해야 하는 것은 한 개의 행(row)을 뒤집은 후, 한 개의 열(column)을 뒤집을 때 얻을 수 있는 1의 최대 개수입니다.예를 들어, 입력 행렬이 다음과 같다면:101010100출력 결과는 8이 됩니다.해결 접근 방법이 문제는 모든 경우의 수를 직접 시뮬레이션하는 대신, 각 행과 열에 포함된 1의 개수를 미리 계산해 두면 O(n×m) 시간 안에 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.행 i를 뒤집으면 해당 행

  3. C++에서 문자열 없이 정수가 회문(Palindrome)인지 확인하는 방법

    문제 개요음수가 아닌 정수 num이 주어졌을 때, 이 숫자가 회문(palindrome)인지 판별하는 프로그램을 작성해야 합니다. 단, 중요한 조건은 문자열을 사용하지 않고 숫자 연산만으로 해결해야 한다는 점입니다.예를 들어 입력값이 1331이라면, 앞에서부터 읽어도 뒤에서부터 읽어도 같은 수이므로 결과는 true(참)가 됩니다.접근 방법핵심 아이디어는 간단합니다. 숫자의 각 자릿수를 하나씩 추출하여 그 숫자 자체를 뒤집은 값(reversed number)을 만들고, 원래 숫자와 비교하는 것입니다.구체적인 알고리즘은 다음과 같습니다.

  4. C++로 이진 탐색으로 찾을 수 있는 요소 개수 구하기

    문제 이해하기 중복되지 않는 정수들로 이루어진 배열 nums가 있다고 가정해 봅시다. 우리가 구해야 할 것은, 표준 이진 탐색(binary search)을 수행했을 때 여전히 성공적으로 찾을 수 있는 정수의 개수입니다. 일반적으로 이진 탐색은 정렬된 배열에서만 동작하지만, 배열이 정렬되어 있지 않더라도 탐색 과정에서 우연히 목표 값이 가운데 위치에 걸리면 값을 발견할 수 있습니다. 이 문제는 바로 그런 운 좋게 찾을 수 있는 원소가 몇 개인지 세는 것입니다. 예를 들어 입력이 [2, 6, 4, 3, 10]이라면 출력은 3이 됩니다.

  5. C++로 구현하는 최댓값·최솟값 교차 정렬 알고리즘

    문제 개요정수로 이루어진 리스트 nums가 주어졌을 때, 아래 규칙에 따라 리스트를 재정렬해야 합니다.첫 번째 요소는 최댓값두 번째 요소는 최솟값세 번째 요소는 두 번째로 큰 값네 번째 요소는 두 번째로 작은 값이후에도 같은 방식으로 큰 값과 작은 값이 번갈아 배치됩니다.예를 들어 입력이 [6, 3, 10, 4]라면, 출력은 [10, 3, 6, 4]가 됩니다. 즉, 가장 큰 값(10), 가장 작은 값(3), 두 번째로 큰 값(6), 두 번째로 작은 값(4) 순서로 정렬되는 것입니다.해결 접근 방법이 문제는 투 포인터(Two Poin

  6. C++로 풀어보는 맥주병 교환 문제 – 마실 수 있는 맥주 총 개수 구하기

    문제 이해하기하나의 숫자 n이 주어지며, 이 값은 가득 찬 맥주병의 개수를 의미합니다. 빈 맥주병 3개를 모으면 새 맥주 1병으로 교환할 수 있을 때, 최종적으로 마실 수 있는 맥주의 총 개수를 구하는 것이 이 문제의 목표입니다.예를 들어 입력이 10이라면 출력은 14가 됩니다.왜 14일까요?처음 10병을 모두 마시면 빈병 10개가 생기고, 누적 10병빈병 9개로 새 맥주 3병을 교환해 마시면 누적 13병, 빈병은 1 + 3 = 4개빈병 3개로 맥주 1병을 더 교환해 마시면 누적 14병, 남은 빈병 2개로는 더 이상 교환 불가해결

  7. C++로 구간(Interval)에서 가장 자주 등장하는 숫자 찾는 방법

    문제 소개정수 리스트의 리스트, 즉 구간(interval) 목록이 주어진다고 가정해 봅시다. 각 구간은 [start, end] 형태를 가집니다. 이때 이 구간들 안에서 가장 많이 등장하는 숫자를 찾아야 합니다. 만약 빈도수가 같은 숫자가 여러 개 있다면, 그중 가장 작은 숫자를 반환하면 됩니다.예를 들어 입력이 [[2, 5], [4, 6], [7, 10], [8, 10]]이라면 출력은 4가 됩니다. 왜냐하면 4는 세 개의 구간 [2,5], [4,6]에 포함되어 가장 높은 빈도를 기록하기 때문입니다.해결 접근 방식: 스위핑(Sweep

  8. C++로 풀어보는 회전문(Revolving Door) 스케줄링 문제

    요청 목록이 주어진다고 가정해 봅시다. 여기서 requests[i]는 [t, d] 형태를 가지며, 시간 t에 한 사람이 문에 도착했고, 그 사람이 안으로 들어가려는지(1로 표시) 아니면 밖으로 나가려는지(0으로 표시)를 의미합니다.문은 하나뿐이고, 문을 사용하는 데는 1시간 단위가 걸립니다. 이때 다음과 같은 규칙을 따라야 합니다.문은 안(in) 상태로 시작하며, 이후에는 마지막 사용자가 사용한 방향으로 설정됩니다.특정 시간 t에 문 앞에 사람이 한 명만 있다면, 그 사람이 곧바로 문을 사용할 수 있습니다.두 명 이상이 동시에 문을

  9. C++로 고유 분수 구하기: 기약분수 변환, 중복 제거, 오름차순 정렬

    분수 목록이 주어집니다. 각 분수는 [분자, 분모] 형태로 표현되며, 이는 분자 / 분모를 의미합니다. 목표는 다음 조건을 모두 만족하는 새로운 분수 목록을 만드는 것입니다. 기약분수로 변환 – 더 이상 약분할 수 없는 가장 간단한 형태로 만듭니다. (예: 20 / 14 → 10 / 7) 중복 제거 – 약분한 결과가 서로 같은 분수는 하나만 남깁니다. 오름차순 정렬 – 분수의 실제 값을 기준으로 작은 값부터 정렬합니다. 부호 통일 – 음수 분수의 - 부호는 항상 분자 쪽에 붙입니다. 예를 들어 입력이 {{16, 8}, {4, 2

  10. C++로 가장 많이 시청한 TV 프로그램의 총 시청 시간 구하기

    문제 소개TV 프로그램 목록과 각 프로그램별 시청 시간 목록, 그리고 정수 k가 주어진다고 가정해 봅시다. shows[i]와 duration[i]는 각각 i번째 시청자가 본 프로그램 이름과 시청 시간을 나타냅니다. 이때 가장 많이 시청된 상위 k개 프로그램의 총 시청 시간을 구하는 것이 우리의 과제입니다.예를 들어, 입력이 다음과 같다고 해보겠습니다.shows: [Castle Play, Fairy Tale Series, Castle Play, Jerry Mouse, Rich Boy]duration: [6, 4, 6, 14, 5]k

  11. C++로 푸는 최소 문자열 변환 문제: 재배열 후 필요한 최소 변경 횟수

    같은 길이를 가진 두 개의 소문자 문자열 s와 t가 주어집니다. 먼저 s를 임의의 순서로 재배열(rearrange)한 다음, s를 t로 만들기 위해 필요한 최소 변경 횟수를 구하는 것이 이 문제의 목표입니다.문제 예시입력이 s = eccynue, t = science라고 가정해 보겠습니다. 이 경우 출력은 2가 됩니다.그 이유는 다음과 같습니다. 먼저 eccynue를 yccence로 재배열하면, 이후 y를 s로 바꾸고 두 번째 c를 i로 바꾸는 두 번의 변경만으로 science를 만들 수 있기 때문입니다.해결 접근 방법이 문제는 문

  12. C++ 문자열 회전 판별: 두 문자열이 서로 회전 관계인지 확인하는 방법

    두 개의 문자열 s와 t가 주어졌을 때, s가 t의 회전(rotation)인지 확인하는 문제를 살펴보겠습니다. 즉, 문자열 s를 회전시켜서 t를 만들어낼 수 있는지 판단하는 것입니다.예를 들어 입력이 s = helloworld, t = worldhello라면, s를 적절히 회전하면 t를 얻을 수 있으므로 출력은 True(1)가 됩니다.해결 접근 방법이 문제는 다음 단계를 따라 해결할 수 있습니다.두 문자열 s0과 s1의 길이가 다르면 false를 반환합니다. 길이가 다른 문자열은 절대 회전 관계일 수 없습니다.s := s0 + s0

  13. C++에서 문자열 압축하기: 연속된 중복 문자 제거 알고리즘

    문자열 s가 주어졌을 때, 이 문자열에서 연속으로 반복되는 문자를 모두 제거하고 결과를 반환하는 문제를 생각해 봅시다. 즉, 같은 문자가 여러 번 연달아 나타나면 하나의 문자만 남기고 나머지는 삭제하며, 문자들의 순서는 원래 그대로 유지해야 합니다.예를 들어 입력이 heeeeelllllllloooooo라면, 출력은 helo가 됩니다.문제 해결 접근 방법이 문제는 문자열을 한 번만 순회하면서 직전 문자와 현재 문자를 비교하는 간단한 방식으로 해결할 수 있습니다. 구체적인 단계는 다음과 같습니다.결과를 저장할 빈 문자열 ret을 준비합

  14. C++ DFS로 이진 트리에서 자손보다 크거나 같은 노드 개수 구하기

    문제 설명이진 트리의 루트(root)가 주어졌을 때, 자신의 값이 모든 자손(descendant) 노드의 값보다 크거나 같은 노드의 개수를 세는 것이 목표입니다.예를 들어 입력 트리가 다음과 같다고 가정해 보겠습니다.이 경우 출력은 4가 됩니다. 값이 3인 노드 하나만 조건을 만족하지 못하고, 나머지 모든 노드는 기준을 충족하기 때문입니다.접근 방법이 문제는 깊이 우선 탐색(DFS)을 활용하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 재귀 호출을 통해 각 서브트리의 최대값을 위로 전달하고, 현재 노드의 값과 비교하는 것입니다

  15. C++로 해결하는 반전된 하위 트리(Inverted Subtree) 문제

    문제 개요이진 트리 두 개가 주어졌다고 가정해 보겠습니다. 하나는 source(원본), 다른 하나는 target(대상)입니다. 우리가 확인해야 할 것은 source의 어떤 반전(inversion) 형태 T가 target의 하위 트리(subtree)로 존재하는지 여부입니다.여기서 하위 트리로 존재한다는 것은 target 내부에 어떤 노드가 있고, 그 노드를 루트로 하는 부분 구조가 자손 노드까지 포함하여 T와 값·구조 측면에서 완전히 동일하다는 의미입니다.반전(inversion)의 정의어떤 트리가 다른 트리의 반전이라고 말할 수 있는

  16. C++로 구현하는 연결 리스트 점프(Jump) 알고리즘

    문제 개요 양의 정수로만 구성된 단일 연결 리스트(singly linked list)가 하나 주어집니다. 이때 각 노드의 다음 포인터(next)가 자신의 값(val)만큼 앞쪽에 있는 노드를 가리키도록 변형된 연결 리스트를 찾아야 하며, 더 이상 도달할 수 있는 노드가 없으면 next는 null이 됩니다. 예를 들어 입력이 [2, 2, 3, 5, 9, 15, 3, 4]라면, 헤드부터 시작해 각 노드의 값만큼 앞으로 점프하며 방문하는 노드들을 따라가므로 출력은 [2, 3, 15]가 됩니다. 해결 전략 핵심 아이디어는 기존 연결 리스

  17. C++로 최소 괄호 삽입 횟수 구하기: 균형 잡힌 괄호 문자열 만들기

    이번 글에서는 ( 와 ) 두 종류의 괄호만으로 이루어진 문자열 s가 주어졌을 때, 이 문자열을 균형 잡힌(balanced) 상태로 만들기 위해 삽입해야 하는 괄호의 최소 개수를 구하는 방법을 알아보겠습니다.여기서 균형 잡힌 문자열이란 모든 여는 괄호 (에 대응하는 닫는 괄호 )가 올바른 순서로 짝지어져 있는 문자열을 의미합니다.문제 예시예를 들어, 입력 문자열이 (()))(라고 가정해 보겠습니다. 이 경우 정답은 2입니다.(()))( 는 괄호를 두 개만 추가하면 다음과 같이 균형 잡힌 문자열로 만들 수 있기 때문입니다.((()))(

  18. C++로 풀어보는 겹치지 않는 두 구간의 최소 크기 합 구하기

    [시작, 끝] 시간 정보를 담고 있는 구간(interval) 목록이 주어졌다고 가정해 보겠습니다. 우리의 목표는 서로 겹치지 않는 두 구간을 골라 그 크기의 합이 최소가 되도록 하는 것입니다. 여기서 구간의 크기는 (끝 - 시작 + 1)로 정의되며, 조건을 만족하는 두 구간을 찾을 수 없다면 0을 반환해야 합니다. 문제 예시 예를 들어 입력이 [[2,5],[9,10],[4,6]]라고 해보겠습니다. 이 경우 출력은 5가 됩니다. 크기가 3인 구간 [4,6]과 크기가 2인 구간 [9,10]을 선택하면 두 구간은 서로 겹치지 않으면서 크

  19. C++로 리스트를 K칸 왼쪽으로 회전시키는 방법

    문제 개요숫자로 이루어진 리스트가 주어졌을 때, 이 리스트를 왼쪽으로 k개의 요소만큼 회전시키는 메서드를 정의하는 것이 목표입니다.예를 들어 입력이 [5,4,7,8,5,6,8,7,9,2]이고 k = 2라면, 앞의 두 요소(5, 4)가 맨 뒤로 이동하여 최종 출력은 [8,5,6,8,7,9,2,5,4,7]이 됩니다.해결 접근 방법이 문제는 다음 단계를 따라 해결할 수 있습니다.결과를 저장할 새로운 배열 ret을 정의합니다.n := nums의 크기로 설정합니다.k := k mod n으로 조정하여 k가 배열 크기보다 큰 경우에도 올바르게

  20. C++에서 가장 짧은 다수 문자 부분 문자열 찾기

    문제 소개 소문자 알파벳으로 이루어진 문자열 s가 주어졌을 때, 어떤 한 문자의 등장 횟수가 나머지 모든 문자의 등장 횟수를 합친 값보다 큰 가장 짧은 부분 문자열(최소 길이 2)의 길이를 구하는 것이 목표입니다. 만약 조건을 만족하는 부분 문자열이 하나도 없다면 -1을 반환해야 합니다. 예를 들어 입력이 abbbcde라면 출력은 2입니다. 부분 문자열 bb가 최소 길이를 가지며, 그 안에서 b가 다른 문자들보다 많이 등장하기 때문입니다. 접근 방법 이 문제의 핵심 통찰은 정답이 될 수 있는 길이는 2 또는 3뿐이라는 점입니다.

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:216/300  20-컴퓨터/Page Goto:1 210 211 212 213 214 215 216 217 218 219 220 221 222