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

C++

  1. C++로 풀어보는 '단어 만들기 스티커' 문제 — 비트마스크 DP 완벽 정리

    문제 이해하기N개의 서로 다른 종류의 스티커가 있다고 가정해 봅시다. 각 스티커에는 하나의 소문자 영단어가 적혀 있으며, 우리는 스티커에서 글자를 하나씩 잘라내고 재배열하여 주어진 목표 문자열(target)을 완성해야 합니다.여기서 중요한 조건은 다음과 같습니다.각 스티커는 필요한 만큼 여러 번 재사용할 수 있습니다.모든 종류의 스티커는 무한개씩 보유하고 있습니다.목표는 target 문자열을 완성하는 데 필요한 최소 스티커 개수를 구하는 것입니다. 만약 어떻게 해도 완성할 수 없다면 -1을 반환합니다.예를 들어 스티커가 [dog,

  2. C++ 블랙리스트 기반 무작위 선택, pick() 함수 효율적으로 구현하기

    문제 개요 구간 [0, N)에 속하는 고유한 정수들로 이루어진 블랙리스트 B가 있다고 가정해 보겠습니다. 이때 블랙리스트에 포함되지 않은 숫자 중 하나를 균등한 확률로 반환하는 무작위 선택 함수를 정의해야 합니다. 또한 random() 함수의 호출 횟수를 줄여 성능을 최적화하는 것이 핵심 목표입니다. 해결 전략: 맵을 활용한 매핑 기법 이 문제는 맵(map)을 활용한 매핑 기법으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다. 블랙리스트를 제외한 실제 선택 가능한 숫자의 개수를 M이라고 합니다. pick()이 호출되면

  3. C++ 범위 모듈(Range Module) 구현: 구간 추가·조회·삭제를 효율적으로 처리하는 방법

    숫자들의 구간(범위)을 추적하는 범위 모듈(Range Module)이 필요하다고 가정해 보겠습니다. 이 모듈은 특정 실수 구간이 현재 추적 중인지 확인하고, 구간을 동적으로 추가하거나 제거할 수 있어야 합니다. 우리의 과제는 다음 인터페이스를 효율적으로 설계하고 구현하는 것입니다. 구현해야 할 인터페이스 addRange(left, right) — 반개구간 [left, right)에 포함된 모든 실수를 추적 대상에 추가합니다. 이미 추적 중인 구간과 부분적으로 겹치더라도, 아직 추적되지 않은 숫자만 새로 추가됩니다. queryRan

  4. C++로 K번째 작은 쌍 거리 찾기: 카운팅 기반 효율적인 풀이법

    문제 소개 정수 배열이 하나 주어졌을 때, 배열 안에서 만들 수 있는 모든 쌍(pair) 중 k번째로 작은 거리를 찾는 것이 목표입니다. 여기서 쌍 (A, B)의 거리란 A와 B 사이의 절댓값 차이를 의미합니다. 예를 들어 입력 배열이 [1, 3, 8]이라면, 만들 수 있는 모든 쌍은 다음과 같습니다. [1, 3] → 거리 2 [3, 8] → 거리 5 [1, 8] → 거리 7 이때 k = 2라면, 두 번째로 작은 거리는 5 (8 - 3)가 됩니다. 풀이 접근 방식 이 문제는 카운팅 배열(counting array)을 활용한 방

  5. C++ 체리 수확(Cherry Pickup) 문제 풀이 – 동적 계획법으로 최대 체리 수집하기

    N×N 크기의 격자(grid)에 체리가 가득 차 있다고 가정해 보겠습니다. 각 칸에는 다음 세 가지 정수 중 하나가 들어 있습니다. 0 – 빈 칸을 의미하며, 자유롭게 지나갈 수 있습니다. 1 – 체리가 들어 있는 칸을 의미하며, 지나가면서 체리를 수확할 수 있습니다. -1 – 가시(thorn)가 있는 칸을 의미하며, 지나갈 수 없어 길을 막습니다. 문제 규칙 다음 규칙에 따라 최대한 많은 체리를 수집해야 합니다. (0, 0)에서 출발해 오른쪽 또는 아래 방향으로만 이동하며, 유효한 경로를 통해 (N-1, N-1)에 도착합니다

  6. C++로 풀어보는 금고 크래킹 문제: 최소 길이 비밀번호 찾기

    문제 소개비밀번호로 보호되는 금고가 하나 있다고 가정해 보겠습니다. 비밀번호는 n자리 숫자로 이루어져 있으며, 각 자리에는 0부터 k-1까지의 숫자 중 하나가 들어갈 수 있습니다. 흥미로운 점은 금고에 숫자를 계속 입력하면, 마지막으로 입력된 n자리가 자동으로 실제 비밀번호와 대조된다는 것입니다.예를 들어 올바른 비밀번호가 563이라면, 우리가 285639를 입력했을 때 입력값의 접미사(suffix)인 563이 실제 비밀번호와 일치하므로 금고는 열리게 됩니다.따라서 우리의 목표는 입력 과정 중 어느 시점에서든 반드시 금고를 열 수

  7. C++로 풀어보는 '상승하는 물에서 수영하기' 문제 – 다익스트라 알고리즘 활용법

    문제 설명 N × N 크기의 격자가 하나 있다고 가정해 봅시다. 각 칸 grid[i][j]는 그 지점 (i, j)의 고도(높이)를 나타냅니다. 이제 비가 내리기 시작했으며, 시각 t일 때 모든 위치의 물 깊이는 t라고 합니다. 우리는 한 칸에서 상하좌우로 인접한 다른 칸으로 이동할 수 있는데, 조건은 두 칸의 고도가 각각 t 이하일 때입니다. 또한 무한히 먼 거리도 시간 0에 헤엄쳐 이동할 수 있다고 가정합니다. 출발점은 (0, 0)이며, 목표는 오른쪽 맨 아래 칸인 (N-1, N-1)입니다. 이 목적지에 도달할 수 있는 최소 시

  8. C++로 시작점에서 목표점까지 도달 가능한지 판별하는 방법

    좌표 평면 위에 시작점 (sx, sy)와 목표점 (tx, ty)가 주어졌다고 가정해 봅시다. 이때 시작점에서 출발하여 일련의 이동을 거쳐 목표점에 도달할 수 있는지 확인하는 것이 이 문제의 핵심입니다.문제 정의여기서 말하는 이동(move)은 현재 점 (x, y)를 다음 두 가지 방식 중 하나로 변환하는 것을 의미합니다.(x, y) → (x, x + y)(x, y) → (x + y, y)예를 들어 입력이 시작점 (1, 1), 목표점 (4, 5)라면 정답은 true입니다. 다음 순서로 이동하면 목표점에 도달할 수 있기 때문입니다.(1,

  9. C++에서 보드를 체스판으로 변환하는 최소 이동 횟수 구하기

    N × N 크기의 보드가 있고, 보드에는 0과 1만 들어 있다고 가정해 봅시다. 한 번의 이동에서는 임의의 두 행(row)을 서로 맞바꾸거나, 임의의 두 열(column)을 서로 맞바꿀 수 있습니다. 목표는 최소 이동 횟수로 이 보드를 체스판 형태로 변환하는 것이며, 변환이 불가능하다면 -1을 반환해야 합니다. 예를 들어 입력이 아래와 같다고 해보겠습니다. 이때 출력은 2가 됩니다. 첫 번째 이동에서 앞쪽 두 열을 서로 교환하면 보드는 다음과 같이 바뀝니다. 이어서 두 번째 행과 세 번째 행을 교환하면, 드디어 원하는 체스판

  10. C++로 K번째로 작은 소수 분수 찾기

    문제 개요정렬된 리스트가 하나 주어진다고 가정해 봅시다. 이 리스트에는 1과 여러 개의 소수가 포함되어 있습니다. 리스트 내의 모든 p < q 조합에 대해 분수 p/q를 고려할 때, 이 분수들 중 K번째로 작은 분수를 찾아야 합니다.결과는 배열 형태로 반환하며, ans[0]에는 분자 p를, ans[1]에는 분모 q를 담습니다.예를 들어 입력이 [1, 3, 5, 7]이고 k = 2라고 해봅시다. 만들 수 있는 분수는 1/3, 1/5, 1/7, 3/5, 3/7, 5/7이고, 이 중 두 번째로 작은 값은 1/5입니다. 따라서 정답은

  11. C++로 풀어보는 팩토리얼 후행 0 함수의 역상(Preimage) 크기 문제

    문제 소개함수 f(x)가 x의 팩토리얼(x!) 값 맨 뒤에 붙은 0의 개수를 반환한다고 가정해 봅시다. 예를 들어 f(3) = 0인데, 이는 3! = 6이라서 끝에 0이 하나도 없기 때문입니다. 반면 f(11) = 2인데, 11! = 39916800처럼 끝에 0이 두 개 붙어 있기 때문입니다.이제 정수 K가 주어졌을 때, f(x) = K를 만족하는 음이 아닌 정수 x가 몇 개 존재하는지 구하는 것이 목표입니다.예를 들어 입력이 K = 2라면 정답은 5가 됩니다.풀이 접근 방법팩토리얼 값의 끝에 붙는 0은 곱셈 과정에서 2와 5가 한

  12. C++로 풀기: 가장 높은 점수를 얻는 최소 회전 K 찾기

    문제 소개 배열 A가 주어져 있고, 이 배열을 K만큼 회전하면 A[K], A[K+1], ..., A[A.length-1], A[0], A[1], ..., A[K-1] 형태가 된다고 가정해 보겠습니다. 이때 회전된 배열에서 자신의 인덱스보다 작거나 같은 값을 가진 원소마다 1점을 얻습니다. 예를 들어 배열 [2, 4, 1, 3, 0]을 K = 2로 회전하면 [1, 3, 0, 2, 4]가 되고, 점수는 다음과 같이 계산됩니다. 인덱스 0: 1 > 0 → 점수 없음 인덱스 1: 3 > 1 → 점수 없음 인덱스 2: 0 ≤

  13. C++로 반원의 넓이와 둘레 계산하기: 초간단 구현 가이드

    문제 개요 이 문제에서는 반원의 반지름을 나타내는 값이 하나 주어지며, 이 값을 이용해 C++로 반원의 넓이와 둘레를 계산하는 프로그램을 작성하는 것이 목표입니다. 반원(Semicircle)은 원을 정확히 절반으로 나눈 닫힌 도형으로, 곡선 부분과 지름(직선 부분)으로 이루어져 있습니다. 예제로 이해하기 입력: R = 5 출력: area = 39.25perimeter = 15.7 해결 접근 방법 반원은 본질적으로 원을 2로 나눈 형태이므로, 원의 넓이 공식을 응용하면 손쉽게 계산할 수 있습니다. 반원의 넓이(A): 원의 넓이의

  14. C++로 평균이 같은 두 배열로 분할하기

    배열 A가 하나 주어졌다고 가정해 봅시다. 우리는 A의 모든 원소를 리스트 B 또는 리스트 C 중 하나로 옮겨야 합니다(리스트 B와 C는 처음에는 비어 있습니다). 모든 원소를 옮긴 후, B와 C가 모두 비어 있지 않으면서 두 리스트의 평균값이 같아질 수 있는지 확인해야 합니다.예를 들어 입력이 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]이라면 결과는 true입니다.문제 접근 방법이 문제의 핵심 아이디어는 간단한 수학적 관계에서 출발합니다. 배열 A의 크기를 n, 전체 합을 total이라 할 때, 어떤 리스트가 k개의

  15. C++로 정이십면체의 넓이와 부피를 구하는 프로그램 작성하기

    이 문제에서는 정이십면체의 한 변의 길이를 나타내는 값이 주어집니다. 우리의 과제는 C++를 사용하여 정이십면체의 표면적(넓이)과 부피를 계산하는 프로그램을 작성하는 것입니다. 정이십면체(Icosahedron)는 정다면체의 하나로, 크기가 모두 같은 정삼각형 면 20개로 이루어진 입체 도형입니다. 모서리는 총 30개이며, 꼭짓점은 12개입니다. 그림에서 점선으로 표시된 부분은 보이는 면 뒤쪽에 위치한 모서리들을 나타냅니다. 예시를 통해 문제를 자세히 이해해 보겠습니다. 입력 a = 4 해결 접근 방법 이 문제는 기하학적으로 이미

  16. C++로 풀어보는 칠판 XOR 게임 문제 완벽 가이드

    문제 소개칠판에 배열 nums의 원소들이 적혀 있다고 가정해 봅시다. 두 명의 플레이어인 램(Ram)과 샘(Sam)이 번갈아 가며 칠판에서 정확히 하나의 숫자를 지우는 게임을 진행합니다. 램이 먼저 시작합니다.게임 규칙은 다음과 같습니다.자신의 차례에 숫자를 지웠을 때, 칠판에 남아 있는 모든 원소의 비트 XOR 값이 0이 되면 그 플레이어가 패배합니다.원소가 하나뿐일 때의 XOR 값은 그 원소 자신이며, 원소가 없을 때의 XOR 값은 0입니다.만약 어떤 플레이어가 자신의 차례를 시작할 때 이미 칠판 전체의 XOR 값이 0이라면,

  17. C++로 타원의 넓이 구하기: 초간단 프로그램 예제

    이 튜토리얼에서는 C++을 사용하여 타원(Ellipse)의 넓이를 계산하는 방법을 알아보겠습니다.타원의 넓이를 구하려면 두 가지 값이 필요합니다. 바로 장반경(semi-major axis)과 단반경(semi-minor axis)입니다. 이 두 값을 이용해 다음 공식으로 타원의 넓이를 계산할 수 있습니다.타원 넓이 공식타원의 넓이 = π × a × b(여기서 a는 장반경, b는 단반경)C++ 예제 코드#include<bits/stdc++.h> using namespace std; // 타원의 넓이를 구하는 함수 void

  18. C++로 푸는 버스 노선 문제: BFS로 최소 탑승 버스 수 구하기

    문제 개요버스 노선 목록이 있다고 가정해 보겠습니다. 각 routes[i]에는 i번째 버스가 영원히 반복 운행하는 경로가 담겨 있습니다. 예를 들어 routes[0] = [1, 5, 7]이라면 0번 버스는 1 → 5 → 7 → 1 → 5 → 7 … 순서로 정류장을 무한히 순환한다는 의미입니다.이제 우리는 어떤 버스도 타지 않은 상태에서 S 정류장에 서 있고, T 정류장으로 이동하려고 합니다. 목적지에 도착하기 위해 최소 몇 대의 버스를 타야 할까요? 만약 어떤 방법으로도 도달할 수 없다면 -1을 반환해야 합니다.예를 들어 입력이 [

  19. C++로 평행사변형 넓이 구하는 프로그램 작성하기

    이 문제에서는 평행사변형의 밑변(base)과 높이(height) 두 값이 주어지며, C++을 이용해 평행사변형의 넓이를 계산하는 프로그램을 만드는 것이 목표입니다.평행사변형이란?평행사변형은 네 개의 변으로 이루어진 닫힌 도형으로, 마주 보는 두 변의 길이가 서로 같고 서로 평행한 사각형입니다. 대표적인 예로 마름모와 직사각형도 평행사변형의 일종에 포함됩니다.문제 이해를 위한 예시입력B = 20, H = 15출력300설명평행사변형의 넓이 = 밑변 × 높이 = 20 × 15 = 300해결 방법이 문제는 기하학에서 사용되는 평행사변형 넓

  20. C++로 풀어보는 자동차 경주 문제: BFS로 최단 명령 시퀀스 찾기

    무한히 뻗은 수직선 위에서 위치 0에서 출발하여 속도 +1로 달리는 자동차가 있다고 가정해 보겠습니다. 이 자동차는 A(가속)와 R(방향 반전) 두 가지 명령으로만 구성된 명령 시퀀스에 따라 스스로 움직입니다.명령 규칙A 명령 (Accelerate, 가속)position := position + speed (현재 속도만큼 전진)speed = speed * 2 (속도를 2배로 증가)R 명령 (Reverse, 방향 반전)속도가 양수라면 speed = -1그렇지 않다면 speed = 1예를 들어 명령 AAR을 실행하면 자동차의 위치는 0

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:179/300  20-컴퓨터/Page Goto:1 173 174 175 176 177 178 179 180 181 182 183 184 185