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

C++

  1. C++로 풀어보는 외로운 픽셀(Lonely Pixel) II 문제

    문제 소개흑백 픽셀로만 구성된 그림이 주어졌을 때, 아래 두 가지 규칙을 모두 만족하는 외로운 검은 픽셀의 개수를 찾아야 합니다.해당 픽셀이 위치한 행 R과 열 C에는 정확히 N개의 검은 픽셀이 존재해야 합니다.열 C에 검은 픽셀을 가진 모든 행은 행 R과 완전히 동일해야 합니다.그림은 검은 픽셀을 의미하는 B와 흰 픽셀을 의미하는 W로 구성된 2차원 char 배열로 표현됩니다.예시로 이해하기다음과 같은 입력이 주어지고 N = 3이라고 가정해 보겠습니다.WBWBBWWBWBBWWBWBBWWWBWBW이때 출력 결과는 6입니다. 1번 열

  2. C++ 문자열로부터 이진 트리 생성하기

    C++ 문자열로부터 이진 트리 생성하기괄호와 정수로만 구성된 문자열이 주어졌다고 가정해 봅시다. 우리는 이 문자열을 해석하여 이진 트리(binary tree)를 구성해야 합니다. 전체 입력 문자열은 하나의 이진 트리를 나타내며, 정수 뒤에는 0개, 1개 또는 2쌍의 괄호가 붙습니다. 여기서 정수는 해당 노드(루트)의 값을 의미하고, 각 괄호 쌍은 동일한 구조를 가진 자식 이진 트리를 감싸고 있습니다.예를 들어, 입력이 "4(2(3)(1))(6(5))"라고 한다면, 출력 결과는 중위 순회(inorder travers

  3. C++로 구현하는 토너먼트 대진표 출력 알고리즘

    문제 설명n개의 팀이 참가하는 대회를 생각해 봅시다. 경기를 최대한 흥미롭게 만들기 위해 이 대회에서는 항상 상대적으로 강한 팀과 상대적으로 약한 팀을 서로 맞대결시킵니다. 예컨대 1위 팀과 n위 팀을 붙이는 방식입니다. 우리가 해야 할 일은 이러한 전략에 따라 완성되는 최종 대진표를 문자열 형태로 구하는 것입니다.각 팀은 1부터 n까지의 양의 정수로 주어지며, 이 값은 초기 순위를 의미합니다. 즉, 1위가 가장 강한 팀이고 n위가 가장 약한 팀입니다. 대진표는 괄호 ( , ) 로 매치를 묶고 쉼표 , 로 구분하여 표현합니다. 매

  4. C++로 이진 트리의 경계 값 구하기 (반시계 방향 순회)

    이진 트리 경계(Boundary) 문제란? 이진 트리가 하나 주어졌을 때, 루트에서 시작하여 반시계 방향으로 트리의 경계에 있는 노드 값들을 순서대로 구해야 합니다. 여기서 경계(boundary)는 중복 노드 없이 다음 세 부분을 포함합니다. 왼쪽 경계: 루트에서 가장 왼쪽 노드까지 내려가는 경로 잎 노드(Leaf): 자식이 없는 말단 노드들 오른쪽 경계: 루트에서 가장 오른쪽 노드까지 내려가는 경로 (역순으로 추가) 만약 루트에 왼쪽 서브트리나 오른쪽 서브트리가 존재하지 않는다면, 루트 자체가 해당 방향의 경계가 됩니다. 예를

  5. C++에서 합이 같은 네 부분으로 배열 분할하는 방법

    문제 개요 n개의 정수로 이루어진 배열이 주어졌을 때, 다음 조건을 모두 만족하는 세 인덱스 (i, j, k)가 존재하는지 판별해야 합니다. 0 < i, i + 1 < j, j + 1 < k < n - 1 부분 배열 (0, i-1), (i+1, j-1), (j+1, k-1), (k+1, n-1)의 합이 서로 동일 여기서 부분 배열 (L, R)은 원본 배열에서 인덱스 L부터 R까지의 구간을 의미합니다. 즉, 배열을 네 개의 연속된 구간으로 나누었을 때 각 구간의 합이 모두 같은지를 확인하는 문제입니다. 예시

  6. C++로 구현하는 이진 트리의 가장 긴 연속 경로 II

    이진 트리가 하나 주어졌을 때, 이 트리에서 가장 긴 연속 경로(Longest Consecutive Path)의 길이를 찾아야 합니다. 여기서 말하는 경로는 값이 증가하는 방향이거나 감소하는 방향일 수 있습니다. 예를 들어 [1,2,3,4]와 [4,3,2,1]은 모두 유효한 경로로 간주되지만, [1,2,4,3]처럼 증감이 섞인 경로는 유효하지 않습니다. 흥미로운 조건은, 경로가 자식 → 부모 → 자식(child-parent-child) 형태를 가질 수도 있다는 점입니다. 즉, 반드시 부모에서 자식으로 내려가는 순서일 필요는 없습니

  7. C++로 연결된 문자열 분할하기 - 사전순 최대 문자열 찾는 알고리즘

    문자열 리스트가 주어졌을 때, 이 문자열들을 하나의 루프(고리) 형태로 연결할 수 있습니다. 각 문자열은 연결할 때 뒤집거나 그대로 사용할 수 있습니다. 가능한 모든 루프 중에서, 루프의 임의의 지점을 잘라 일반적인 문자열로 만들었을 때 사전순(lexicographically)으로 가장 큰 문자열을 찾아야 합니다.이 문제를 해결하려면 다음 두 단계를 거쳐야 합니다.문제 정의1단계: 문자열 연결 — 주어진 순서대로 모든 문자열을 하나의 루프로 연결합니다. 이때 각 문자열은 원본 그대로이거나 뒤집힌 형태일 수 있습니다.2단계: 자르기

  8. C++로 구하는 이진 행렬에서 가장 긴 연속된 1의 라인

    문제 소개 0과 1로만 구성된 이진 행렬(binary matrix) M이 주어졌을 때, 행렬 안에서 연속된 1로 이루어진 가장 긴 라인의 길이를 찾는 문제입니다. 이때 라인은 가로(수평), 세로(수직), 대각선, 반대 대각선 네 방향 중 어느 것이든 가능합니다. 예를 들어 입력이 다음과 같다면, 011001100001 정답은 3이 됩니다. 두 번째 열에 세로 방향으로 연속된 세 개의 1이 존재하기 때문입니다. 해결 전략: 동적 계획법(DP) 이 문제는 동적 계획법(Dynamic Programming)을 활용하면 효율적으로 해결할 수

  9. C++로 풀어보는 다람쥐 시뮬레이션: 견과류 수집 최소 이동 거리 구하기

    문제 개요 2차원 격자 위에 나무 한 그루, 다람쥐 한 마리, 그리고 여러 개의 견과류가 놓여 있습니다. 각 위치는 격자의 셀(cell) 좌표로 표현되며, 목표는 다람쥐가 모든 견과류를 하나씩 모아 나무 아래에 옮겨놓을 때 필요한 최소 이동 거리를 구하는 것입니다. 다람쥐에게는 두 가지 제약 조건이 주어집니다. 한 번에 최대 한 개의 견과류만 가질 수 있습니다. 상, 하, 좌, 우 네 방향으로 인접한 셀로만 이동할 수 있으며, 거리는 이동 횟수, 즉 맨해튼 거리(Manhattan Distance)로 측정합니다. 예를 들어 높이

  10. C++에서 프로세스 종료하기: BFS로 자식 프로세스까지 한 번에 제거하는 방법

    문제 이해n개의 프로세스가 있다고 가정해 봅시다. 각 프로세스는 PID(프로세스 ID)라는 고유한 식별자를 가지며, PPID(부모 프로세스 ID) 또한 존재합니다.각 프로세스는 오직 하나의 부모 프로세스만 가지지만, 하나 이상의 자식 프로세스를 가질 수 있습니다. 즉, 전체 구조는 트리(tree) 형태와 같습니다. PPID가 0인 프로세스는 단 하나뿐이며, 이는 부모가 없는 최상위(root) 프로세스를 의미합니다. 모든 PID는 고유한 양의 정수입니다.프로세스 목록은 두 개의 정수 리스트로 표현됩니다. 첫 번째 리스트에는 각 프로세

  11. C++로 문자열에 볼드(<b>) 태그 추가하는 방법

    문제 개요문자열 s와 문자열 목록 dict가 주어졌다고 가정해 봅시다. 우리가 해야 할 일은 s 안에서 dict에 포함된 부분 문자열을 찾아, 여는 태그 <b>와 닫는 태그 </b> 한 쌍으로 감싸는 것입니다.이때 두 가지 규칙을 반드시 지켜야 합니다.두 부분 문자열이 서로 겹쳐서(overlap) 나타나는 경우, 태그를 따로 감싸지 않고 한 쌍의 볼드 태그로 함께 감싸야 합니다.볼드 처리된 두 부분 문자열이 연속적으로 붙어 있는 경우, 이 역시 하나로 결합하여 한 번만 감싸야 합니다.예를 들어 입력이 s = a

  12. C++로 구현하는 최소 분해(Minimum Factorization) 알고리즘

    문제 소개 양의 정수 x가 주어졌을 때, 각 자릿수의 곱이 x와 같아지는 가장 작은 양의 정수 b를 찾아야 합니다. 만약 조건을 만족하는 답이 존재하지 않는다면 0을 반환합니다. 예를 들어 입력이 48이라면 출력은 68입니다. 6 × 8 = 48이므로 두 자릿수의 곱이 정확히 48이 되기 때문입니다. 해결 접근 방식 이 문제는 탐욕적(Greedy) 기법으로 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다. 답이 되는 수의 각 자릿수는 2~9 사이여야 하며, 이들의 곱이 x와 같아야 합니다. 자릿수가 적을수록 수가

  13. C++로 배열의 완전 순열(Derangement) 개수 구하기

    문제 개요 1부터 n까지의 수가 오름차순으로 나열된 배열이 주어졌을 때, 이 배열로 만들 수 있는 완전 순열(derangement)의 개수를 구하는 것이 목표입니다. 조합수학에서 완전 순열이란 집합의 모든 원소를 재배치하되, 어떤 원소도 원래 자리에 남지 않도록 배치한 순열을 의미합니다. 결과값이 매우 커질 수 있으므로, 최종 답은 10^9 + 7로 나눈 나머지를 반환해야 합니다. 예를 들어 입력이 3이라면 출력은 2입니다. 원래 배열이 [1, 2, 3]일 때 조건을 만족하는 완전 순열은 [2, 3, 1]과 [3, 1, 2] 두

  14. C++로 풀어보는 4키 키보드 문제: 최대 개수의 'A' 출력하기

    문제 이해하기키보드에서 딱 네 개의 키만 사용해 화면에 최대한 많은 문자 A를 출력하는 것이 이 글의 목표입니다. 사용할 수 있는 키는 A, C, V, 그리고 Ctrl입니다.가장 많은 A를 만들기 위해서는 다음 키 조합을 활용해야 합니다.Ctrl + A : 전체 선택Ctrl + C : 복사Ctrl + V : 붙여넣기예를 들어 키 입력 횟수가 7번이라면 정답은 9가 됩니다. 먼저 A를 세 번 누른 뒤, 이어서 Ctrl+A(전체 선택), Ctrl+C(복사), Ctrl+V(붙여넣기), Ctrl+V(붙여넣기) 순서로 입력하면 화면에는 총

  15. C++로 해결하는 이진 트리 균등 분할(Equal Tree Partition) 문제

    문제 개요n개의 노드로 구성된 이진 트리가 주어졌을 때, 원본 트리에서 정확히 하나의 간선을 제거하여 트리를 두 개로 분할했을 때, 두 트리의 노드 값 합이 서로 같아질 수 있는지 확인하는 것이 이번 문제의 목표입니다.예를 들어 아래와 같은 트리가 입력으로 주어진다면,출력 결과는 true가 됩니다.해결 접근 방법이 문제는 재귀적 깊이 우선 탐색(DFS)과 스택을 활용하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.각 노드를 루트로 하는 부분 트리(subtree)의 합을 모두 계산하여 스택에 저장합니다.전체 트리

  16. C++로 해결하는 경로 합 IV(Path Sum IV): 루트-리프 경로 합 구하기

    깊이가 5보다 작은 이진 트리를 정수 리스트로 표현한다고 가정해 보겠습니다. 트리의 깊이가 5 미만이라면, 이 트리는 세 자리 정수들의 리스트로 나타낼 수 있습니다. 리스트에 포함된 각 정수는 다음과 같은 정보를 담고 있습니다.백의 자리 숫자: 해당 노드의 깊이(D)를 나타내며, 1 ≤ D ≤ 4 범위를 가집니다.십의 자리 숫자: 노드가 속한 레벨에서의 위치(P)를 나타내며, 범위는 1~8입니다. 이 위치는 완전 이진 트리에서의 위치와 동일합니다.일의 자리 숫자: 노드의 값(V)을 나타내며, 0 ≤ V ≤ 9 범위를 가집니다.우리가

  17. C++로 다음으로 가까운 시간(Next Closest Time) 구하기

    문제 개요HH:MM 형식으로 표현된 시간이 주어졌을 때, 현재 시간에 사용된 숫자들을 재활용하여 만들 수 있는 다음으로 가까운 시간을 구하는 문제입니다. 이때 각 숫자는 무제한으로 재사용할 수 있습니다.예를 들어 입력이 19:34라면 출력은 19:39가 됩니다. 숫자 1, 9, 3, 4를 조합하여 만들 수 있는 시간 중 현재보다 가장 가까운 미래 시각이 19:39이기 때문입니다. 참고로 19:33은 겉보기에는 더 가까워 보이지만, 실제로는 자정을 지나 23시간 59분 후에야 도래하는 시간이므로 정답이 될 수 없습니다.풀이 접근 방법

  18. C++로 구현하는 고유 섬(Distinct Islands) 개수 세기: DFS 완전 정복

    문제 개요2차원 이진 배열 grid가 주어졌을 때, 섬(island)은 상하좌우(4방향)로 연결된 1(육지)들의 묶음을 의미합니다. 그리드의 네 가장자리는 모두 물로 둘러싸여 있다고 가정하며, 우리가 구해야 할 값은 서로 다른 섬의 개수입니다.두 섬이 같은 섬으로 판정되는 조건은, 한 섬을 회전하거나 반전하지 않고 평행 이동만 했을 때 다른 섬과 정확히 일치하는 경우입니다.입력 예시그리드가 아래와 같이 주어졌다고 가정해 보겠습니다.11011100000000111011이때 출력은 3입니다. 왼쪽 위의 L자 모양 섬 1개, 길이 2인

  19. C++로 크기를 알 수 없는 정렬된 배열에서 타겟 검색하기

    오름차순으로 정렬된 배열이 주어졌을 때, 배열 안에서 특정 타겟 값을 찾는 함수를 정의해야 합니다. 타겟이 존재하면 해당 인덱스를 반환하고, 존재하지 않으면 -1을 반환합니다.여기서 중요한 조건은 배열의 크기를 알 수 없다는 점입니다. 배열에 접근할 수 있는 유일한 방법은 ArrayReader 인터페이스를 사용하는 것으로, ArrayReader.get(k)를 호출하면 인덱스 k에 위치한 요소를 반환받을 수 있습니다.예를 들어, 입력이 array = [-1,0,3,5,9,12], target = 9라면 출력은 4가 됩니다. 9가 배열

  20. C++에서 정렬된 순환 연결 리스트에 값 삽입하기

    문제 소개 증가 순서로 정렬된 순환 연결 리스트(Circular Linked List)의 한 노드가 주어졌을 때, 새로운 값 insertVal을 리스트에 삽입하되 리스트가 계속 정렬된 상태를 유지하도록 하는 함수를 작성해야 합니다. 여기서 중요한 점은 주어진 노드가 리스트 내 임의의 노드에 대한 참조일 수 있으며, 반드시 시작 노드일 필요는 없다는 것입니다. 삽입 가능한 적절한 위치가 여러 곳이라면 그중 어디에 넣어도 무방합니다. 만약 리스트가 비어 있다면 새 노드 하나로 구성된 순환 리스트를 생성하고 그 노드를 반환해야 하며, 리

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:224/300  20-컴퓨터/Page Goto:1 218 219 220 221 222 223 224 225 226 227 228 229 230