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

C++

  1. C++로 구현하는 지그재그 반복자(Zigzag Iterator)

    C++ 지그재그 반복자(Zigzag Iterator)란? 두 개의 1차원 배열(벡터)이 주어졌을 때, 두 배열의 원소를 번갈아가며 차례로 반환하는 반복자를 구현하는 문제입니다. 이 반복자는 다음 두 가지 메서드를 제공해야 합니다. next() — 다음 원소를 반환합니다. hasNext() — 아직 반환할 다음 원소가 남아 있는지 확인합니다. 예를 들어 입력이 v1 = [1, 2], v2 = [3, 4, 5, 6]이라면 출력 순서는 [1, 3, 2, 4, 5, 6]처럼 두 배열을 교차하며 순회하게 됩니다. 한쪽 배열이 먼저 소진되

  2. C++로 구현하는 BST(이진 탐색 트리)의 중위 순회 후속자 찾기

    문제 개요이진 탐색 트리(BST)와 그 안에 있는 특정 노드가 주어졌을 때, 해당 노드의 중위 순회 후속자(in-order successor)를 찾는 문제입니다. 여기서 노드 p의 후속자란 p.val보다 큰 키 값들 중에서 가장 작은 값을 가진 노드를 의미합니다.예를 들어 입력이 다음과 같다고 가정해 보겠습니다.root = [2, 1, 3]p = 1이 경우 출력은 2가 됩니다.해결 접근 방식BST의 성질을 활용하면 재귀 호출만으로 간단하게 문제를 해결할 수 있습니다. 단계별로 살펴보겠습니다.root와 p를 매개변수로 받는 재귀 함수

  3. C++로 푸는 벽과 게이트(Walls and Gates) 문제 – BFS 최단 거리 알고리즘

    m × n 크기의 2차원 격자(grid)가 하나 주어지며, 이 격자는 다음 세 가지 값 중 하나로 초기화되어 있다고 가정합니다.-1: 벽 또는 장애물0: 게이트(gate)INF: 무한대를 뜻하며, 빈 방(empty room)을 의미합니다.여기서 INF는 2³¹ − 1 = 2147483647이며, 게이트까지의 거리는 항상 2147483647보다 작다고 가정할 수 있습니다. 목표는 각 빈 방을 가장 가까운 게이트까지의 거리로 채우는 것입니다. 만약 어떤 방에서 게이트에 도달하는 것이 불가능하다면, 해당 방은 INF 값을 그대로 유지해야

  4. C++로 풀어보는 뒤집기 게임 II (Flip Game II)

    문제 개요두 명의 플레이어가 번갈아 가며 진행하는 뒤집기 게임(Flip Game)을 생각해 보겠습니다. 주어진 문자열에는 오직 두 가지 문자, 즉 +와 -만 포함되어 있습니다. 플레이어 1과 플레이어 2는 자신의 차례에 연속된 두 개의 ++를 --로 뒤집어야 합니다. 더 이상 뒤집을 수 있는 위치가 없는 플레이어가 등장하면 게임이 종료되며, 그 시점에 마지막으로 수를 둔 상대편이 승리하게 됩니다.우리가 구현해야 할 함수는 선공 플레이어가 최선의 전략으로 플레이할 때 반드시 승리를 보장할 수 있는지를 판별하는 것입니다.예를 들어 입력

  5. C++로 구현하는 이진 트리의 가장 긴 연속 수열 경로 찾기

    문제 개요 하나의 이진 트리가 주어졌을 때, 이 트리에서 가장 긴 연속 수열 경로(longest consecutive sequence path)의 길이를 찾아야 합니다. 여기서 경로란 어떤 시작 노드에서 출발하여 부모-자식 연결 관계를 따라 트리 내의 임의의 노드까지 이어지는 노드들의 나열을 의미합니다. 중요한 조건은, 연속 경로가 반드시 부모 노드에서 자식 노드 방향으로만 진행되어야 하며, 자식에서 부모로 거슬러 올라가는 역방향 이동은 허용되지 않는다는 점입니다. 예제로 이해하기 예를 들어 다음과 같은 이진 트리가 입력으로 주어

  6. C++를 활용한 희소 행렬 곱셈 효율적 구현 방법

    두 개의 행렬 A와 B가 주어졌을 때, 두 행렬의 곱 AB를 계산해야 합니다. 이때 A의 열 개수는 B의 행 개수와 같다고 가정할 수 있습니다. 예를 들어 입력이 [[1,0,0],[-1,0,3]]과 [[7,0,0],[0,0,0],[0,0,1]]이라면, 100-103 700000001 출력은 [[7,0,0],[-7,0,3]]이 됩니다. 700-703 알고리즘 접근 방법 희소 행렬(sparse matrix)은 대부분의 원소가 0으로 채워져 있는 행렬을 의미합니다. 모든 원소를 순회하며 곱하는 대신 0이 아닌 원소만 미리 저장해 두면

  7. C++로 구현하는 이진 트리 수직 순회(Vertical Order Traversal)

    문제 소개 이진 트리가 하나 주어졌을 때, 노드 값들을 수직 순회(vertical order traversal)하는 문제를 살펴보겠습니다. 수직 순회란 트리를 위에서 아래로 내려다보았을 때 보이는 순서대로 노드를 방문하는 방식으로, 같은 열(column)에 위치한 노드들은 하나의 그룹으로 묶습니다. 만약 두 노드가 같은 행과 같은 열에 있다면, 순서는 반드시 왼쪽에서 오른쪽 방향이어야 합니다. 예를 들어 다음과 같은 이진 트리가 입력으로 주어지면, 각 노드의 열 좌표는 루트(3)가 0, 왼쪽 자식(9)이 -1, 오른쪽 자식(20)

  8. C++로 구현하는 일반화된 약어(Generalized Abbreviation) 생성 알고리즘

    문제 소개 하나의 단어가 주어졌을 때, 그 단어의 일반화된 약어(generalized abbreviation)를 모두 생성하는 함수를 작성해야 합니다. 일반화된 약어란 단어 내 연속된 문자 일부를 그 개수에 해당하는 숫자로 대체한 형태를 의미하며, 인접한 두 숫자가 서로 붙어 있어서는 안 됩니다. 예를 들어 입력이 "word"라면 출력은 ["word", "1ord", "w1rd", "wo1d", "wor1", "2rd

  9. C++ 무방향 그래프에서 연결 요소(Connected Component) 개수 구하기

    n개의 노드가 0부터 n-1까지 번호로 매겨져 있고, 무방향 간선(undirected edges)의 목록이 함께 주어졌다고 가정해 봅시다. 이때 그래프 내부에 존재하는 연결 요소(connected component)의 개수를 구하는 함수를 정의하는 것이 문제의 목표입니다.예를 들어 n = 5이고 edges = [[0, 1], [1, 2], [3, 4]]인 경우를 살펴보겠습니다.위 그래프에서 노드 0, 1, 2는 서로 연결되어 하나의 그룹을 이루고, 노드 3과 4는 별도의 그룹을 이룹니다. 따라서 연결 요소의 개수는 2가 됩니다.문제

  10. C++로 풀어보는 합이 k와 같은 가장 긴 부분 배열 찾기

    문제 설명nums라는 배열과 목표값 k가 주어졌을 때, 원소들의 합이 정확히 k가 되는 부분 배열(subarray) 중 가장 긴 길이를 구하는 문제입니다. 조건을 만족하는 부분 배열이 존재하지 않는다면 0을 반환해야 합니다.예를 들어 입력이 nums = [1, -1, 5, -2, 3], k = 3이라면 출력은 4가 됩니다. 부분 배열 [1, -1, 5, -2]의 합이 정확히 3이면서 가장 길기 때문입니다.접근 방법: 누적 합(Prefix Sum)과 해시 맵모든 부분 배열을 일일이 확인하는 브루트 포스 방식은 O(n²)의 시간이 걸리

  11. C++로 해결하는 가장 큰 BST(이진 탐색 트리) 서브트리 찾기

    문제 개요하나의 이진 트리가 주어졌을 때, 그 안에서 노드 수가 가장 많은 BST(이진 탐색 트리) 형태의 서브트리를 찾아야 합니다. 여기서 가장 크다는 것은 해당 서브트리에 포함된 노드의 개수가 가장 많다는 의미입니다.예를 들어 아래와 같은 이진 트리가 입력으로 주어지면,정답은 3이 됩니다. 이 경우 가장 큰 BST 서브트리는 그림에서 강조된 부분이기 때문입니다.해결 접근 방법이 문제는 후위 순회(postorder traversal) 방식으로 트리를 탐색하면서, 각 노드마다 다음 네 가지 정보를 함께 관리하면 효율적으로 해결할 수

  12. C++ DFS 알고리즘으로 풀어보는 안드로이드 잠금 해제 패턴 개수 구하기

    안드로이드 스마트폰에서 흔히 볼 수 있는 3x3 패턴 잠금 화면을 생각해 봅시다. 두 정수 m과 n이 주어지며(1 ≤ m ≤ n ≤ 9), 이때 최소 m개의 키부터 최대 n개의 키까지 사용하여 만들 수 있는 잠금 해제 패턴의 총 개수를 구하는 것이 목표입니다. 문제의 규칙 패턴을 만들 때 반드시 지켜야 할 규칙은 다음과 같습니다. 각 패턴은 최소 m개, 최대 n개의 키를 연결해야 합니다. 모든 키는 중복 없이 한 번씩만 사용할 수 있습니다. 패턴에서 연속된 두 키를 잇는 선분이 다른 키를 통과한다면, 그 키는 반드시 미리 선택되

  13. C++로 인용 목록에서 H-지수(H-Index) 계산하는 방법

    연구자의 논문별 인용 횟수가 담긴 배열이 주어졌을 때, 해당 연구자의 H-지수(H-index)를 계산하는 함수를 만들어 보겠습니다. H-지수란 무엇인가? H-지수는 연구자의 논문이 학계에 미치는 영향력을 평가하는 대표적인 지표입니다. 공식적인 정의는 다음과 같습니다. 연구자의 전체 논문 수가 N일 때, 그중 h편의 논문이 각각 최소 h번 이상 인용되었고, 나머지 N − h편의 논문은 각각 h번 이하로 인용되었다면, 이 연구자의 H-지수는 h이다. 예를 들어 인용 배열이 [5, 4, 1, 2, 6]이라면 결과값은 3이 됩니다. 3회

  14. C++로 이진 탐색 트리(BST)의 중위 후속자(Inorder Successor) 찾기

    이진 탐색 트리(BST)와 특정 노드 p가 주어졌을 때, 해당 노드의 중위 후속자(Inorder Successor)를 찾아야 합니다.중위 후속자란 노드 p보다 키 값이 큰 노드들 중에서 가장 작은 값을 가지는 노드를 의미합니다. 즉, 중위 순회(In-order Traversal) 기준으로 p 바로 다음에 방문하게 되는 노드입니다.문제 이해하기예를 들어 다음과 같은 이진 탐색 트리가 있다고 가정해 보겠습니다.이때 p = 1이라면, 1보다 큰 값 중 가장 작은 값은 2이므로 출력 결과는 2가 됩니다.해결 접근 방법BST의 핵심 속성(왼

  15. C++로 정렬된 연결 리스트를 높이 균형 이진 탐색 트리(BST)로 변환하는 프로그램

    C++에서 요소들이 비내림차순(오름차순)으로 정렬되어 있는 단일 연결 리스트(singly linked list)가 주어졌을 때, 이를 높이 균형 이진 탐색 트리(height balanced BST)로 변환하는 방법을 알아보겠습니다. 예를 들어 연결 리스트가 [-10, -3, 0, 5, 9]와 같이 구성되어 있다면, 이를 변환하여 만들 수 있는 트리는 다음과 같습니다. 문제 해결 접근 방법 이 문제는 다음 단계를 따라 해결할 수 있습니다. 연결 리스트가 비어 있으면 null을 반환합니다. 리스트의 시작 노드를 매개변수로 받는 재

  16. C++로 풀어보는 라인 리플렉션(Line Reflection): 점들의 대칭 여부 확인하기

    2D 평면 위에 n개의 점이 주어졌을 때, 이 점들을 좌우 대칭으로 반사시키는 y축에 평행한 직선이 존재하는지 확인하는 문제입니다. 즉, 모든 점을 어떤 직선을 기준으로 반사했을 때, 반사된 점들의 집합이 원래 점들의 집합과 완전히 같아지는 선이 있는지 판별해야 합니다.예를 들어 입력이 points = [[1,1],[-1,1]]과 같다면,두 점은 x = 0을 기준으로 서로 대칭이므로 출력은 true가 됩니다.문제 해결 접근 방법이 문제의 핵심 아이디어는 다음과 같습니다. 만약 대칭축이 존재한다면, 그 축은 반드시 x좌표의 최솟값과

  17. C++에서 변환된 배열 정렬하기 – 투 포인터 알고리즘 풀이

    문제 소개정수로 이루어진 정렬된 배열 nums와 세 개의 정수 a, b, c가 주어졌다고 가정해 보겠습니다. 우리가 해야 할 일은 배열의 각 원소 x에 이차함수 f(x) = ax² + bx + c를 적용한 후, 결과 배열을 다시 오름차순으로 정렬된 상태로 만드는 것입니다.예를 들어 입력이 nums = [-4, -2, 2, 4], a = 1, b = 3, c = 5라면 각 원소에 함수를 적용한 결과는 [3, 9, 15, 33]이 되며, 이것이 곧 정답이 됩니다.접근 방법: 투 포인터(Two Pointers)모든 원소에 함수를 적용한

  18. C++로 풀어보는 폭탄 적(Bomb Enemy) 문제: 하나의 폭탄으로 제거 가능한 최대 적 수 구하기

    문제 개요2차원 격자(grid)가 주어진다고 가정해 봅시다. 각 칸은 다음 세 가지 중 하나입니다.W — 벽(Wall)E — 적(Enemy)0 — 빈 공간우리는 하나의 폭탄을 사용해서 제거할 수 있는 최대 적의 수를 구해야 합니다. 폭탄을 설치하면, 해당 지점에서 같은 행과 같은 열에 있는 모든 적이 제거되며, 폭탄의 영향은 벽(W)을 만나는 순간 멈춥니다. 또한 폭탄은 오직 빈 공간(0)에만 설치할 수 있습니다.예를 들어 아래와 같은 입력이 주어졌다고 합시다.초록색 위치에 폭탄을 설치하면 3명의 적을 동시에 제거할 수 있으므로,

  19. C++로 히트 카운터 설계하기: 지난 5분간의 히트 수 집계 알고리즘

    문제 소개 지난 5분 동안 받은 히트(hit) 수를 집계하는 히트 카운터(Hit Counter)를 설계한다고 가정해 보겠습니다. 이 카운터는 초 단위의 타임스탬프(timestamp)를 매개변수로 받는 함수를 제공하며, 호출은 항상 시간 순서대로 이루어진다고 가정합니다. 즉, 타임스탬프는 단조롭게 증가하고, 가장 이른 타임스탬프는 1부터 시작합니다. 또한 여러 개의 히트가 거의 같은 시점에 몰려서 도착할 수도 있습니다. 구현해야 할 함수는 다음 두 가지입니다. hit(timestamp): 해당 시점에 히트가 발생했음을 기록합니다.

  20. C++에서 이진 트리의 잎 찾기: DFS 높이 계산으로 레벨별 노드 제거하기

    문제 이해 하나의 이진 트리가 주어졌다고 가정해 봅시다. 우리는 트리의 모든 잎(leaf) 노드를 수집한 뒤 제거하고, 이 과정을 트리가 완전히 비워질 때까지 반복해야 합니다. 각 라운드마다 제거된 노드들을 차례대로 기록하면, 마치 트리를 아래층부터 한 겹씩 벗겨 내는 것과 같은 결과를 얻게 됩니다. 예를 들어 아래와 같은 이진 트리가 입력으로 주어지면, 출력은 다음과 같습니다. [[4, 5, 3], [2], [1]] 첫 번째 라운드에서 잎 노드인 4, 5, 3이 제거되고, 두 번째 라운드에서 2가, 마지막 라운드에서 루트인 1이

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:228/300  20-컴퓨터/Page Goto:1 222 223 224 225 226 227 228 229 230 231 232 233 234