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

C++

  1. C++로 풀어보는 최적의 만남 지점(Best Meeting Point) 문제

    문제 개요두 명 이상으로 구성된 그룹이 함께 만나려고 하며, 이때 총 이동 거리를 최소화하는 만남 지점을 찾는다고 가정해 봅시다. 0 또는 1의 값을 가지는 2차원 격자(grid)가 주어지고, 값이 1인 칸은 그룹원 중 한 사람의 집 위치를 나타냅니다.거리 계산에는 맨해튼 거리(Manhattan Distance) 공식을 사용합니다.distance(p1, p2) = |p2.x - p1.x| + |p2.y - p1.y|입력 예시100010000000100출력6위 행렬에서 세 사람은 각각 (0,0), (0,4), (2,2)에 살고 있습니

  2. C++로 구현하는 이진 트리 직렬화 및 역직렬화 알고리즘

    하나의 이진 트리가 주어졌을 때, 이를 직렬화(serialize)하고 역직렬화(deserialize)해야 한다고 가정해 봅시다.직렬화란 데이터 구조나 객체를 일련의 비트(bit) 형태로 변환하여 파일이나 메모리 버퍼에 저장할 수 있게 만드는 과정입니다. 이렇게 저장된 데이터는 나중에 동일한 컴퓨터 환경 또는 전혀 다른 환경에서도 원래의 구조로 복원할 수 있습니다.따라서 여기서는 이진 트리를 직렬화하고 역직렬화하는 알고리즘을 설계해야 합니다. 이진 트리(binary tree)는 각 노드가 최대 2개의 자식 노드를 가질 수 있는 루트

  3. C++ 이진 탐색으로 검은 픽셀을 모두 감싸는 최소 사각형 넓이 구하기

    문제 설명 0은 흰색 픽셀, 1은 검은색 픽셀을 나타내는 이진 행렬(binary matrix)로 이미지가 표현되어 있다고 가정해 보겠습니다. 검은색 픽셀들은 서로 연결되어 있어 검은색 영역은 단 하나만 존재하며, 픽셀은 가로와 세로 방향으로 연결됩니다. 이때 검은색 픽셀 중 하나의 위치 (x, y)가 주어지면, 모든 검은색 픽셀을 감싸는 가장 작은 축 평행(axis-aligned) 사각형의 넓이를 구해야 합니다. 예를 들어 입력 이미지가 다음과 같다고 합시다. 001001100100 x = 0, y = 2가 주어지면 출력 결과는

  4. C++로 해결하는 2D 범위 합 쿼리(변경 가능) – 2차원 펜윅 트리 활용법

    2차원 행렬 matrix가 주어졌을 때, 왼쪽 위 모서리(row1, col1)와 오른쪽 아래 모서리(row2, col2)로 정의되는 직사각형 영역 안에 있는 모든 요소의 합을 계산하는 문제입니다. 여기에 더해, 행렬의 특정 위치 값을 갱신(update)한 후에도 같은 연산을 효율적으로 수행할 수 있어야 합니다.예를 들어 입력이 다음과 같다고 가정해 보겠습니다.3014256321120154101710305이 행렬에 대해 다음과 같이 메서드를 호출한다고 가정합니다.sumRegion(2, 1, 4, 3)update(3, 2, 2)sumR

  5. C++로 풀어보는 모든 건물까지의 최단 거리 문제

    문제 소개 빈 땅 위에 집을 하나 짓고자 할 때, 이 집에서 모든 건물까지의 이동 거리의 합이 최소가 되는 위치를 찾아야 합니다. 이동은 상·하·좌·우 네 방향으로만 가능하며, 값이 0, 1, 2로 구성된 2D 그리드가 입력으로 주어집니다. 각 값의 의미는 다음과 같습니다. 0 : 자유롭게 지나다닐 수 있는 빈 땅 1 : 통과할 수 없는 건물 2 : 통과할 수 없는 장애물 예를 들어 입력이 아래와 같다고 가정해 보겠습니다. 10201 00000 00100 세 개의 건물이 각각 (0,0), (0,4), (2,2)에 위치하고

  6. C++로 풀어보는 최대 K개의 서로 다른 문자를 가진 가장 긴 부분 문자열 문제

    문자열이 하나 주어졌을 때, 서로 다른 문자가 최대 k개 이하로 포함된 가장 긴 부분 문자열(substring) T의 길이를 구하는 것이 이번 문제의 목표입니다.예를 들어 입력이 s = eceba, k = 2라고 가정해 보겠습니다. 이 경우 정답은 3이 됩니다. 조건을 만족하는 가장 긴 부분 문자열은 ece이고, 그 길이가 3이기 때문입니다.문제 해결 접근 방식: 슬라이딩 윈도우(Sliding Window)이 문제는 슬라이딩 윈도우 기법과 해시 맵(빈도수 카운트)을 함께 사용하면 효율적으로 해결할 수 있습니다. 두 개의 포인터 i와

  7. C++로 같은 문자가 최소 k 거리 떨어지도록 문자열 재정렬하기

    문제 개요 비어 있지 않은 문자열 s와 정수 k가 주어졌을 때, 같은 문자끼리 서로 최소 k만큼 거리를 유지하도록 문자열을 재정렬해야 합니다. 문자열은 소문자로만 구성되어 있으며, 조건을 만족하는 재정렬이 불가능한 경우에는 빈 문자열을 반환합니다. 예를 들어 s = aabbcc, k = 3이 입력으로 주어지면 정답 중 하나는 abcabc입니다. 동일한 문자가 이전에 등장한 위치와 최소 3칸 이상 떨어져 있기 때문입니다. 조건만 충족한다면 여러 가지 정답이 허용되며, 아래 코드의 실행 결과는 bacbac입니다. 알고리즘 접근 방식

  8. C++로 풀어보는 완벽한 직사각형(Perfect Rectangle) 문제

    N개의 축에 평행한(axis-aligned) 직사각형이 주어졌을 때, 이 직사각형들이 모두 합쳐져 하나의 직사각형 영역을 정확히 덮는지(exact cover) 판별해야 합니다. 여기서 정확히 덮는다는 것은 직사각형들 사이에 빈 공간도 없고, 서로 겹치는 부분도 없어야 한다는 의미입니다. 각 직사각형은 왼쪽 아래 꼭짓점과 오른쪽 위 꼭짓점 두 좌표로 표현되며, 예를 들어 단위 정사각형은 [1,1,2,2]로 나타냅니다. 즉, 왼쪽 아래 점은 (1, 1), 오른쪽 위 점은 (2, 2)입니다. 예를 들어 입력이 rectangles = [

  9. C++로 풀어보는 최소 고유 단어 약어(Minimum Unique Word Abbreviation)

    문제 소개 word라는 문자열이 주어졌을 때, 이 문자열이 가질 수 있는 모든 약어는 다음과 같습니다. [word, 1ord, w1rd, wo1d, wor1, 2rd, w2d, wo2, 1o1d, 1or1, w1r1, 1o2, 2r1, 3d, w3, 4] 여기서 목표 문자열(target)과 문자열들의 집합인 사전(dictionary)이 함께 주어집니다. 우리가 찾아야 하는 것은 사전에 있는 어떤 단어의 약어와도 충돌하지 않으면서, 길이가 가장 짧은 목표 문자열의 약어입니다. 약어에서 숫자와 문자는 각각 길이 1로 계산되므로, 예를

  10. C++로 해결하는 단어 사각형(Word Square) 문제

    서로 다른 고유한 단어들로 이루어진 집합이 주어졌을 때, 이 단어들을 조합하여 만들 수 있는 모든 단어 사각형(Word Square)을 찾아야 합니다. 여기서 단어 사각형이란 k번째 행과 k번째 열이 정확히 동일한 문자열이 되는 단어 시퀀스를 의미하며, 조건은 0 ≤ k < max(numRows, numColumns)입니다.예를 들어 [ball, area, lead, lady]라는 단어 시퀀스는 아래와 같이 배치했을 때 가로 방향과 세로 방향 어느 쪽으로 읽어도 같은 문자열이 되므로 유효한 단어 사각형을 구성합니다.ballar

  11. C++로 N-진 트리(N-ary Tree) 직렬화와 역직렬화 구현하기

    문제 개요N-진 트리(N-ary Tree)가 하나 주어졌을 때, 이 트리를 직렬화(serialize)하고 역직렬화(deserialize)해야 한다고 가정해 봅시다.직렬화(Serialization)란 데이터 구조나 객체를 일련의 비트 형태로 변환하여 파일이나 메모리 버퍼에 저장할 수 있게 하는 과정입니다. 저장된 데이터는 이후 동일한 환경 또는 다른 컴퓨터 환경에서 원래 상태 그대로 복원할 수 있습니다.N-진 트리(N-ary Tree)는 루트(root)를 가지며, 각 노드가 최대 N개까지만 자식 노드를 가질 수 있는 트리 구조를 의미

  12. C++로 N-ary 트리를 이진 트리로 인코딩하고 디코딩하는 방법

    N-ary 트리를 이진 트리로 변환하는 문제란? N-ary 트리(N진 트리)는 하나의 노드가 여러 개의 자식 노드를 가질 수 있는 트리 구조입니다. 이번 글에서는 이러한 N-ary 트리를 이진 트리(binary tree)로 인코딩(직렬화)하는 방법과, 반대로 인코딩된 이진 트리를 다시 원래의 N-ary 트리로 복원(역직렬화)하는 방법을 C++ 코드로 자세히 살펴보겠습니다. 예를 들어 다음과 같은 N-ary 트리가 입력으로 주어졌다고 가정해 보겠습니다. 이 트리를 인코딩하면 같은 데이터를 담고 있는 이진 트리 구조로 변환되며, 디코

  13. C++로 구현하는 최적의 계정 밸런싱: 최소 거래 횟수로 부채 정산하기

    친구 여러 명이 함께 휴가를 떠났고, 도중에 서로 돈을 빌려주곤 했다고 가정해 보겠습니다. 예를 들어 아미트(Amit)가 비크람(Bikram)의 점심값 10달러를 대신 지불했고, 이후 찬단(Chandan)이 아미트에게 택시비 5달러를 건넸습니다.우리는 각 거래를 (x, y, z) 형태의 튜플로 모델링하려고 합니다. 여기서 x는 돈을 보낸 사람, y는 돈을 받은 사람, z는 금액을 의미합니다.아미트, 비크람, 찬단을 각각 0번, 1번, 2번 사람이라고 하면, 위의 거래 내역은 [[0, 1, 10], [2, 0, 5]]로 표현할 수 있

  14. C++에서 반복 횟수 세기: 사이클 탐지로 효율적으로 풀기

    문제 개요비어 있지 않은 두 문자열 s1과 s2(각각 최대 100자), 그리고 0 이상 10⁶ 이하 범위의 두 숫자 n1과 n2가 주어집니다. 이를 바탕으로 S1 = [s1, n1], S2 = [s2, n2]라고 정의합니다.여기서 S = [s, n]은 문자열 s를 n번 이어 붙인 문자열을 의미합니다. 예를 들어 [ab, 4]는 abababab가 됩니다.반대 방향의 개념도 하나 정의할 필요가 있습니다. 문자열 s2에서 일부 문자를 제거했을 때 s1이 만들어진다면, s1을 s2로부터 얻을 수 있다고 표현합니다. 따라서 abc는 abdb

  15. C++로 구현하는 최소 길이 문자열 인코딩 알고리즘

    문제 개요비어 있지 않은 문자열이 하나 주어졌을 때, 인코딩된 결과의 길이가 최소가 되도록 해당 문자열을 인코딩해야 합니다.인코딩 규칙은 k[encoded_string] 형태입니다. 이는 대괄호 안의 encoded_string이 정확히 k번 반복된다는 의미입니다. 단, 다음 조건을 반드시 지켜야 합니다.k는 항상 양의 정수여야 합니다.인코딩된 문자열은 비어 있으면 안 되며, 불필요한 공백을 포함해서도 안 됩니다.입력 문자열에는 소문자만 포함되어 있다고 가정합니다.만약 인코딩 과정을 거쳐도 문자열이 더 짧아지지 않는다면, 해당 문자열

  16. C++로 푸는 '모든 단어 연결 부분 문자열' 문제 – 슬라이딩 윈도우 알고리즘

    문자열 s와 단어 배열 words가 주어졌다고 가정해 보겠습니다. 배열에 포함된 모든 단어는 길이가 서로 같습니다. 우리가 찾아야 할 것은 문자열 s 안에서 words의 각 단어를 정확히 한 번씩 사용해 연결(concatenation)한 부분 문자열이 시작되는 모든 인덱스입니다. 단, 단어 사이에 다른 문자가 끼어 있어서는 안 됩니다.예를 들어 입력 문자열이 barfoothefoobarman이고 words가 [foo, bar]라면 출력은 [0, 9]가 됩니다. 인덱스 0에서 시작하는 barfoo와 인덱스 9에서 시작하는 foobar

  17. C++ 미로 문제 III: 공이 구멍에 떨어지는 최단 경로 구하기

    문제 소개빈 칸과 벽으로 이루어진 미로 안에 공 하나가 놓여 있다고 가정해 보겠습니다. 공은 위(u), 아래(d), 왼쪽(l), 오른쪽(r) 네 방향으로 굴러갈 수 있으며, 한 번 굴러가기 시작하면 벽에 부딪힐 때까지 멈추지 않습니다. 공이 멈춘 지점에서는 다음 방향을 다시 선택할 수 있습니다. 또한 미로에는 구멍(hole)이 하나 존재하는데, 공이 구멍 위를 지나가면 그대로 구멍 속으로 떨어집니다.공의 시작 위치, 구멍의 위치, 그리고 미로 정보가 주어졌을 때, 공이 구멍에 떨어질 수 있는 최단 거리의 이동 경로를 찾아야 합니다.

  18. C++로 N × 3 그리드를 색칠하는 방법의 수 구하기

    문제 소개n × 3 크기의 그리드가 있고, 그리드의 모든 칸을 빨강(Red), 노랑(Yellow), 초록(Green) 세 가지 색 중 정확히 하나로 칠하려고 합니다.여기에는 한 가지 제약 조건이 있습니다. 가로 또는 세로로 인접한 두 칸은 서로 같은 색이어서는 안 된다는 것입니다. 그리드의 행 개수 n이 주어졌을 때, 이 그리드를 조건에 맞게 칠할 수 있는 방법의 총 개수를 구해야 합니다. 답은 매우 커질 수 있으므로 109 + 7로 나눈 나머지를 반환합니다.예를 들어 입력이 1이라면, 한 행을 칠하는 경우의 수는 총 12가지이므로

  19. C++로 최댓값 탐색 비용이 정확히 K가 되는 배열 구성하기

    세 개의 정수 n, m, k가 주어졌을 때, 다음은 양의 정수로 이루어진 배열에서 최댓값을 찾는 알고리즘입니다.max_val := -1 max_ind := -1 search_cost := 0 n := size of arr for initialize i := 0, when i < n, update (increase i by 1), do: if max_val < arr[i], then: max_val := arr[i] max_ind := i (increase search_co

  20. C++로 구현하는 인접 레벨 노드를 제외한 이진 트리의 최대 합 구하기

    이 문제에서는 양수로만 구성된 이진 트리(binary tree)가 주어집니다. 목표는 인접한 두 레벨의 노드를 동시에 선택할 수 없다는 조건을 지키면서 트리 전체에서 얻을 수 있는 최대 합(maximum sum)을 구하는 프로그램을 C++로 작성하는 것입니다. 문제 설명 여기서 말하는 최대 합은 트리의 노드 값들을 더하되, 합계에 포함된 노드들이 서로 인접한 레벨(부모-자식 관계)에 걸쳐 있지 않도록 선택했을 때 얻을 수 있는 가장 큰 값을 의미합니다. 예제로 이해하기 루트(레벨 1)에서 출발하는 경우와, 루트의 자식 노드들(레

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:193/300  20-컴퓨터/Page Goto:1 187 188 189 190 191 192 193 194 195 196 197 198 199