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

C++

  1. C++로 이진 트리에서 중복 서브트리 찾는 방법 완벽 가이드

    이진 트리(binary tree)가 주어졌을 때, 모든 중복 서브트리(duplicate subtrees)를 찾아야 합니다. 여기서 각 종류의 중복 서브트리마다 그중 하나의 루트 노드만 반환하면 됩니다.예를 들어 다음과 같은 트리가 있다고 가정해 보겠습니다.이 트리에서 찾을 수 있는 중복 서브트리는 다음과 같습니다.해결 접근 방식이 문제의 핵심 아이디어는 각 서브트리를 고유한 문자열로 직렬화(serialize)하는 것입니다. 동일한 구조와 값을 가진 서브트리는 반드시 동일한 문자열 표현을 갖게 되므로, 해시 맵을 이용해 등장 횟수를

  2. C++로 이진 트리 출력하기: 2차원 문자열 배열 변환 완벽 가이드

    이진 트리를 주어진 규칙에 따라 m×n 크기의 2차원 문자열 배열 형태로 출력해야 하는 경우가 있습니다. 이 문제를 해결하는 방법을 단계별로 살펴보겠습니다.출력 규칙행의 개수(m)는 주어진 이진 트리의 높이와 같아야 합니다.열의 개수(n)는 항상 홀수여야 합니다.루트 노드의 값은 첫 번째 행에서 정확히 가운데 위치에 배치해야 합니다. 루트 노드가 위치한 행과 열은 나머지 공간을 두 부분으로 나누는데, 각각 좌하단 영역과 우하단 영역입니다. 좌측 서브트리는 좌하단 영역에, 우측 서브트리는 우하단 영역에 출력합니다. 이때 좌하단 영역과

  3. C++에서 배열을 연속 부분 수열로 분할하는 방법

    문제 개요오름차순으로 정렬된 배열 nums가 주어졌을 때, 이 배열을 하나 이상의 부분 수열로 분할할 수 있는 경우에만 true를 반환하는 문제입니다. 단, 각 부분 수열은 다음 두 가지 조건을 반드시 만족해야 합니다.수열을 구성하는 값들이 서로 연속된 정수여야 합니다. (예: 3, 4, 5)각 부분 수열의 길이는 최소 3 이상이어야 합니다.예를 들어 입력이 [1,2,3,3,4,4,5,5]라면 출력은 true입니다. 이 배열을 [1,2,3,4,5]와 [3,4,5]라는 두 개의 연속 시퀀스로 나눌 수 있기 때문입니다.알고리즘 접근 방

  4. C++로 구현하는 아름다운 배열 II: k개의 고유한 차잇값을 가진 배열 만들기

    두 개의 정수 n과 k가 주어졌을 때, 1부터 n까지 범위에 속하는 서로 다른 양의 정수 n개로 이루어진 배열을 만들어야 합니다. 단, 이 배열은 다음 규칙을 만족해야 합니다.만들어진 배열이 [a1, a2, a3, …, an]일 때, 인접한 두 원소의 절댓값 차이로 이루어진 목록 [|a1 − a2|, |a2 − a3|, |a3 − a4|, …, |an−1 − an|]에는 정확히 k개의 고유한 정수가 존재해야 합니다. 조건을 만족하는 답이 여러 개라면 그중 어떤 것을 출력해도 무방합니다.예를 들어 입력이 n = 3, k = 2라면 결

  5. C++로 풀어보는 전구 스위치 II 문제 풀이

    처음에 모두 켜져 있는 n개의 전구가 있는 방과 벽면에 부착된 4개의 버튼이 있다고 가정해 보겠습니다. 정확히 m번의 버튼 조작을 수행한 후, n개의 전구가 가질 수 있는 서로 다른 상태의 가짓수를 구하는 것이 이 문제의 목표입니다.전구에는 [1, 2, 3, ..., n]과 같이 번호가 매겨져 있으며, 4개의 버튼은 각각 다음과 같은 기능을 합니다.모든 전구의 상태를 반전(켜짐 ↔ 꺼짐)시킵니다.짝수 번호의 전구를 반전시킵니다.홀수 번호의 전구를 반전시킵니다.(3k + 1)번째 전구를 반전시킵니다. (k = 0, 1, 2, ...)

  6. C++로 구현하는 체스판 나이트 확률 문제 완벽 가이드

    NxN 크기의 체스판이 하나 주어지고, 나이트(기사)가 r행 c열에서 출발하여 정확히 K번 이동하려고 합니다. 행과 열은 0부터 시작하는 인덱스를 사용하므로, 좌측 상단 칸은 (0, 0), 우측 하단 칸은 (N-1, N-1)입니다.나이트는 한 칸에서 총 8가지 방향으로 이동할 수 있으며, 그 이동 경로는 아래 다이어그램과 같습니다.나이트는 이동할 때마다 8가지 가능한 이동 중 하나를 무작위로 선택합니다. 나이트는 정확히 K번 이동을 마치거나 체스판 밖으로 벗어날 때까지 계속 움직입니다. 우리가 구해야 하는 것은 나이트가 이동을 멈췄

  7. C++로 해결하는 단조 증가 자릿수(Monotone Increasing Digits) 문제

    음이 아닌 정수 N이 주어졌을 때, N보다 작거나 같으면서 단조 증가(monotone increasing)하는 자릿수를 가진 가장 큰 수를 구하는 것이 이 문제의 목표입니다. 어떤 정수가 단조 증가하는 자릿수를 가진다는 것은, 인접한 두 자릿수 x와 y에 대해 항상 x <= y가 성립한다는 의미입니다. 예를 들어 입력이 332라면 출력은 299가 됩니다.문제 이해하기332는 마지막 자리에서 3에서 2로 감소하기 때문에 단조 증가하지 않습니다. 따라서 332 이하의 수 중에서 각 자릿수가 왼쪽에서 오른쪽으로 커지거나 같게 유지되

  8. C++로 풀어보는 '숫자에 도달하기' 문제: 최소 이동 횟수 구하기

    무한히 뻗어 있는 수직선 위에서 여러분은 위치 0에 서 있다고 가정해 보겠습니다. 그리고 목표 지점인 target이 어딘가에 놓여 있습니다. 매번 이동할 때 왼쪽 또는 오른쪽 어느 방향이든 선택할 수 있으며, n번째 이동(1부터 시작)에서는 정확히 n칸을 이동해야 합니다. 이때 목적지에 도달하기 위해 필요한 최소 이동 횟수를 구하는 것이 이 문제의 핵심입니다.예를 들어 target = 3이라면 정답은 2입니다. 첫 번째 이동에서 0에서 1로, 두 번째 이동에서 1에서 3으로 이동하면 되기 때문입니다.문제 해결 접근 방법이 문제는 다

  9. C++로 풀어보는 전역 역전과 지역 역전(Global & Local Inversions) 판별 문제

    문제 소개[0, 1, ..., N-1]로 구성된 순열(permutation) A가 있다고 가정해 봅시다. 여기서 N은 배열 A의 길이입니다.전역 역전(global inversion)은 0 <= i < j < N을 만족하는 모든 인덱스 쌍 (i, j) 중에서 A[i] > A[j]인 경우의 수를 의미합니다. 즉, 배열 안에서 더 큰 값이 더 작은 값보다 앞에 있는 모든 경우를 세는 것입니다.지역 역전(local inversion)은 0 <= i < N을 만족하는 인덱스 i에 대해 A[i] > A[i

  10. C++ 재귀 함수로 풀어보는 문법의 K번째 기호 문제

    첫 번째 행에는 숫자 0이 하나 있다고 가정해 봅시다. 그다음 행부터는 바로 앞 행을 참조하여, 각 0은 01로, 각 1은 10으로 바꾸어 나갑니다. 이렇게 생성된 수열에서 N개의 행과 인덱스 K가 주어졌을 때, N번째 행의 K번째 위치에 있는 기호를 찾는 것이 이번 문제의 목표입니다. (K 값은 1부터 시작합니다.)예를 들어 N = 4, K = 5가 주어진다면 출력 결과는 1이 됩니다. 그 이유는 다음과 같습니다.행 1: 0행 2: 01행 3: 0110행 4: 01101001문제 해결 접근 방법이 문제는 재귀적 사고방식으로 접근하

  11. C++로 풀어보는 숲 속의 토끼 문제

    문제 소개숲속에 살고 있는 토끼들은 각자 서로 다른 색을 가지고 있다고 가정해 봅시다. 이제 토끼들 중 일부(전부일 수도 있습니다)가 자신과 같은 색을 가진 다른 토끼가 몇 마리인지 대답하고, 그 대답들이 하나의 배열에 담겨 있습니다. 우리의 목표는 숲속에 있을 수 있는 토끼의 최소 마리 수를 구하는 것입니다.예를 들어 입력이 [1, 1, 2]라면 출력은 5가 됩니다. 그 이유는 다음과 같습니다. 1이라고 대답한 두 마리의 토끼는 서로 같은 색, 예를 들어 흰색일 수 있습니다. 그런데 2라고 대답한 토끼는 흰색일 수 없습니다. 만약

  12. C++로 풀어보는 유령 탈출(Escape the Ghosts) 문제

    간단한 팩맨 게임을 한다고 상상해 봅시다. 우리는 좌표 (0, 0)에서 출발하여 목적지 (target[0], target[1])에 도달해야 합니다. 맵 위에는 여러 마리의 유령이 있으며, i번째 유령은 (ghosts[i][0], ghosts[i][1])에서 시작합니다. 매 턴마다 우리와 모든 유령은 동시에 북·동·서·남 네 방향 중 하나를 선택해 이동하며, 한 번에 거리 1만큼 움직일 수 있습니다.탈출에 성공하는 조건은 단 하나, 어떤 유령보다 먼저 목적지에 도착하는 것입니다. 유령이 어떤 경로로 움직이더라도 목표에 먼저 도달할 수

  13. C++로 풀어보는 평균의 최대 합 문제

    문제 이해하기 숫자로 이루어진 배열 A가 주어졌을 때, 이를 최대 K개의 인접한 그룹으로 분할한다고 가정해 보겠습니다. 이때 점수는 각 그룹의 평균값들의 합으로 정의되며, 우리의 목표는 얻을 수 있는 가장 큰 점수를 찾는 것입니다. 예를 들어 A = [9,1,2,3,9]이고 K = 3이라면 결과는 20이 됩니다. 가장 좋은 선택은 A를 [9], [1, 2, 3], [9]로 나누는 것이기 때문입니다. 따라서 답은 다음과 같습니다. 9 + (1 + 2 + 3) / 3 + 9 = 20 물론 [9, 1], [2], [3, 9]처럼 나누는

  14. C++로 연결 리스트의 연결 요소(Connected Components) 개수 구하기

    문제 개요고유한 정수 값들로 이루어진 연결 리스트의 헤드(head) 노드가 주어집니다. 추가로, 연결 리스트에 포함된 값들의 부분 집합인 리스트 G도 함께 주어집니다.이때 G 내부에서 두 값이 연결 리스트 상에서 연속적으로 나타난다면 서로 연결되어 있다고 정의합니다. 우리가 구해야 할 것은 바로 G에 존재하는 연결 요소(connected components)의 개수입니다.예시연결 리스트가 [0, 1, 2, 3]이고 G = [0, 1, 3]이라면 결과는 2입니다. 0과 1은 리스트에서 연속적으로 등장하므로 하나의 그룹으로 묶이고, 3

  15. C++로 단어의 최단 인코딩 구현하기 – 트라이(Trie) 활용 방법

    문제 소개단어 목록이 주어지면, 참조 문자열(reference string) S와 인덱스 리스트 A를 작성하여 이를 인코딩할 수 있습니다. 예를 들어 단어 목록이 [time, me, bell]이라면, S = time#bell#이고 indexes = [0, 2, 5]로 표현할 수 있습니다. 각 인덱스 위치에서는 참조 문자열을 해당 지점부터 # 기호를 만날 때까지 읽어 원래 단어를 복원합니다.따라서 우리가 구해야 하는 것은 주어진 단어들을 모두 인코딩할 수 있는 가장 짧은 참조 문자열 S의 길이입니다. 위 예제에서 정답은 10입니다.접

  16. C++로 구현하는 카드 뒤집기 게임(Card Flipping Game)

    테이블 위에 N장의 카드가 놓여 있다고 가정해 보겠습니다. 각 카드의 양면에는 양의 정수가 인쇄되어 있으며, 양면의 숫자는 서로 다를 수 있습니다. 우리는 원하는 만큼 카드를 뒤집은 후 한 장의 카드를 선택할 수 있습니다. 이때 선택한 카드 뒷면에 적힌 숫자 X가 어떤 카드의 앞면에도 존재하지 않는다면, 그 숫자 X를 좋은(good) 숫자라고 부릅니다. 목표는 이러한 좋은 숫자 중 가장 작은 값을 찾는 것이며, 만약 좋은 숫자가 하나도 존재하지 않는다면 0을 반환해야 합니다.여기서 fronts[i]와 backs[i]는 각각 i번째

  17. C++ 동적 계획법으로 풀어보는 인수 이진 트리(Binary Trees With Factors) 문제

    문제 설명 1보다 큰 양의 정수로 이루어진 리스트가 있다고 가정해 봅시다. 이 정수들을 사용하여 이진 트리를 만들어야 하며, 각 숫자는 원하는 만큼 여러 번 재사용할 수 있습니다. 단, 하나의 조건이 붙습니다. 리프 노드가 아닌 모든 노드는 반드시 자식 노드 값들의 곱(product)이 되어야 한다는 것입니다. 그렇다면 주어진 숫자들로 총 몇 개의 이진 트리를 만들 수 있을까요? 정답은 매우 커질 수 있으므로 10^9 + 7로 나눈 나머지를 반환해야 합니다. 예를 들어 입력이 [2, 4, 5, 10]이라면 다음과 같이 총 7개의 트

  18. C++로 풀어보는 '적절한 나이의 친구' 문제

    여러 사람이 서로 친구 요청을 보낸다고 가정해 봅시다. 각 사람의 나이는 ages[i] 배열에 저장되어 있으며, 이 값은 i번째 사람의 나이를 의미합니다. 이때 아래 조건 중 하나라도 참이면, A는 B(B ≠ A)에게 친구 요청을 보내지 않습니다. age[B] <= 0.5 * age[A] + 7 age[B] > age[A] age[B] > 100 && age[A] < 100 세 조건 모두 해당하지 않는 경우에만 A가 B에게 친구 요청을 보냅니다. 단, A가 B에게 요청했다고 해서 B도 반드시

  19. C++ 문자열 찾기 및 바꾸기: 치환 연산 구현 방법

    문제 개요문자열 S가 주어지고, 여기에 몇 가지 치환(replacement) 연산을 수행한다고 가정해 보겠습니다. 각 치환 연산은 세 가지 매개변수를 가집니다 — 시작 인덱스 i, 원본 단어(source) x, 대상 단어(target) y입니다. 규칙은 다음과 같습니다. 만약 x가 원본 문자열 S의 위치 i에서 시작한다면, 해당 위치에 등장하는 x를 y로 교체합니다. 조건이 맞지 않으면 아무 작업도 수행하지 않습니다.예를 들어, S = abcd이고 치환 연산이 i = 2, x = cd, y = ffff라고 해보겠습니다. cd가 원본

  20. C++로 해결하는 새로운 21 게임(New 21 Game) 문제

    문제 설명Rima가 카드 게임 21에서 아이디어를 얻은 다음과 같은 게임을 한다고 가정해 보겠습니다. Rima는 0점에서 시작하며, 자신의 점수가 K 미만일 때까지 계속해서 숫자를 뽑습니다. 매번 숫자를 뽑을 때마다 주어진 정수 W에 대해 [1, W] 범위 안의 정수 포인트를 무작위로 얻게 됩니다. 각 추첨은 서로 독립적이며, 모든 결과는 동일한 확률로 나타납니다. Rima는 점수가 K점 이상이 되면 숫자 뽑기를 중단합니다.이때 우리가 구해야 하는 것은 Rima가 최종적으로 N점 이하를 가질 확률입니다.예를 들어 N = 6, K =

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:171/300  20-컴퓨터/Page Goto:1 165 166 167 168 169 170 171 172 173 174 175 176 177