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

C++

  1. C++ 알고리즘 풀이: 개구리 울음소리에 필요한 최소 개구리 수 구하기

    문제 개요개구리 울음소리를 나타내는 문자열 croakOfFrogs가 주어집니다. 이 문자열에는 여러 마리 개구리가 내는 croak 소리가 뒤섞여 있으며, 여러 개구리가 동시에 운다는 점이 특징입니다. 우리의 목표는 주어진 문자열의 모든 울음소리를 완성하기 위해 필요한 최소 개구리 수를 구하는 것입니다.여기서 유효한 croak란 한 마리 개구리가 c, r, o, a, k 다섯 글자를 순서대로 발성하는 것을 의미합니다. 개구리는 반드시 다섯 글자를 모두 내야 하나의 울음소리가 완성되며, 만약 문자열이 유효한 croak 조합이 아니라면

  2. C++로 카드 더미에서 얻을 수 있는 최대 점수 구하기

    문제 개요여러 장의 카드가 한 줄로 나열되어 있고, 각 카드에는 고유한 점수가 부여되어 있습니다. 이 점수들은 정수 배열 cardPoints로 주어집니다. 매 단계마다 줄의 맨 앞 또는 맨 뒤에서 카드를 한 장씩 가져올 수 있으며, 정확히 k장을 가져와야 합니다. 최종 점수는 가져온 카드들의 점수 합이며, 목표는 얻을 수 있는 최대 점수를 찾는 것입니다.예를 들어 cardPoints = [1,2,3,4,5,6,1], k = 3이 주어지면 출력은 12입니다. 첫 번째 선택 시 왼쪽 끝 카드를 가져가든 오른쪽 끝 카드를 가져가든 점수는

  3. C++ 대각선 순회 II — 리스트의 리스트를 대각선 순서로 탐색하는 방법

    문제 소개리스트의 리스트(list of lists) 형태로 주어진 nums의 모든 원소를 대각선 순서(diagonal order)대로 출력하는 것이 이번 문제의 목표입니다.예를 들어 다음과 같은 입력이 주어진 경우,출력은 아래와 같습니다.[1, 6, 2, 8, 7, 3, 9, 4, 12, 10, 5, 13, 11, 14, 15, 16]해결 접근 방법핵심 아이디어는 각 원소가 속한 대각선 번호를 계산한 뒤, 그 번호를 기준으로 정렬하는 것입니다. 행 인덱스와 열 인덱스의 합(i + j)이 같은 원소들은 모두 같은 대각선 위에 위치한다

  4. C++로 정수의 자릿수를 바꿔 얻을 수 있는 최대 차이 구하기

    정수 num이 하나 주어져 있다고 가정해 봅시다. 우리는 아래의 연산을 정확히 두 번 적용해야 합니다.0부터 9 사이의 숫자 x를 하나 선택합니다.0부터 9 사이의 또 다른 숫자 y를 선택합니다. 이때 y는 x와 같아도 됩니다.num의 십진수 표현에서 x가 등장하는 모든 자릿수를 y로 바꿉니다. 단, 새로 만들어지는 정수는 선행 0(leading zero)을 가질 수 없으며, 값이 0이 되어서도 안 됩니다.첫 번째 연산의 결과를 a, 두 번째 연산의 결과를 b라고 할 때, a와 b 사이의 최대 차이를 구하는 것이 이 문제의 목표입니

  5. C++에서 한 문자열이 다른 문자열을 깨뜨릴 수 있는지 확인하는 방법

    문제 개요길이가 같은 두 문자열 s1과 s2가 주어졌을 때, s1의 어떤 순열(permutation)이 s2의 어떤 순열을 깨뜨릴 수 있는지, 혹은 그 반대가 가능한지 확인해야 합니다.여기서 문자열 a가 문자열 b를 깨뜨린다는 것은, 인덱스 0부터 n-1까지의 모든 i에 대해 x[i] >= y[i](알파벳 순서 기준)를 만족한다는 의미입니다.예를 들어 입력이 s1 = abc, s2 = xya라고 가정해 보겠습니다. 이 경우 출력은 true가 됩니다. s2의 순열인 ayx가 s1의 순열인 abc를 깨뜨릴 수 있기 때문입니다. 실

  6. C++로 0과 1 배열에서 모든 1이 최소 K칸 이상 떨어져 있는지 확인하는 방법

    0과 1로만 구성된 배열 nums와 정수 k가 주어졌을 때, 배열에 있는 모든 1이 서로 최소 k칸 이상 떨어져 있는지 확인하는 문제입니다. 조건을 만족하지 않으면 false를 반환해야 합니다.예를 들어 입력이 nums = [1,0,0,0,1,0,0,1], k = 2라면 출력은 true가 됩니다. 각각의 1이 서로 최소 2칸 이상 떨어져 있기 때문입니다.문제 해결 접근 방식이 문제는 배열을 한 번만 순회하면서 직전에 등장한 1의 위치를 기억하는 그리디 방식으로 해결할 수 있습니다. 단계별 접근 방법은 다음과 같습니다.변수 last를

  7. C++로 풀기: 절대 차이가 제한 이하인 가장 긴 연속 부분 배열 찾기

    문제 개요정수 배열 nums와 정수 limit가 주어졌을 때, 부분 배열 내 임의의 두 원소 간 절대 차이가 주어진 제한(limit)보다 작거나 같은 조건을 만족하는 가장 긴 비어 있지 않은 연속 부분 배열의 길이를 구하는 문제입니다.예를 들어 입력이 다음과 같다고 가정해 보겠습니다.nums = [8, 2, 4, 7], limit = 4이 경우 정답은 2입니다. 모든 가능한 부분 배열을 확인해 보면 그 이유를 알 수 있습니다.[8] → |8 - 8| = 0 ≤ 4 ✅[8, 2] → |8 - 2| = 6 > 4 ❌[8, 2, 4

  8. C++로 배열에서 동일한 XOR 값을 가지는 삼중항 (i, j, k) 개수 구하기

    문제 설명정수 배열 arr가 주어졌을 때, 세 개의 인덱스 i, j, k를 선택한다고 가정해 봅시다. 이때 인덱스는 다음 조건을 만족해야 합니다.(0 <= i < j <= k < N) — 여기서 N은 배열의 크기입니다.각 값은 아래와 같이 정의됩니다.a = arr[i] XOR arr[i + 1] XOR ... XOR arr[j - 1]b = arr[j] XOR arr[j + 1] XOR ... XOR arr[k]우리가 구해야 하는 것은 a와 b의 값이 서로 같은 삼중항 (i, j, k)의 개수입니다.예를 들어

  9. C++로 트리의 모든 사과를 수집하는 최소 시간 구하기

    정점이 n개로 이루어진 무방향 트리가 있다고 가정해 보겠습니다. 각 정점에는 0부터 n-1까지 번호가 매겨져 있으며, 일부 정점에는 사과가 놓여 있습니다. 트리의 한 간선을 지나갈 때마다 1초가 소요됩니다. 우리가 구해야 할 것은 정점 0에서 출발하여 트리에 있는 모든 사과를 수집한 뒤, 다시 정점 0으로 돌아올 때까지 걸리는 최소 시간(초)입니다.무방향 트리의 간선 정보는 edges 배열로 주어집니다. edges[i] = [from_i, to_i]는 정점 from_i와 to_i를 연결하는 간선이 존재한다는 의미입니다. 또한 has

  10. C++로 0과 1 사이의 모든 기약분수 구하기

    문제 설명정수 n이 하나 주어집니다. 우리는 분모가 n 이하이면서 0과 1 사이(경계값 제외)에 있는 모든 기약분수(simplified fraction)의 목록을 구해야 합니다. 분수들은 어떤 순서로 나열되어도 상관없습니다.예를 들어 입력이 n = 4라면 출력은 [1/2, 1/3, 1/4, 2/3, 3/4]가 됩니다. 2/4는 1/2로 약분할 수 있기 때문에 기약분수가 아니며, 따라서 목록에 포함되지 않습니다.접근 방법이 문제는 다음과 같은 단계로 해결할 수 있습니다.결과를 저장할 배열 ret을 정의합니다.바깥 루프: i를 2부터

  11. C++로 이진 트리의 '좋은 노드' 개수 구하기

    이진 트리가 하나 주어졌을 때, 루트(root)에서 노드 X까지의 경로에 있는 노드 중 값이 X보다 큰 노드가 하나도 없다면 그 노드 X를 좋은 노드(good node)라고 정의합니다. 이 문제의 목표는 이진 트리 전체에서 좋은 노드가 총 몇 개인지 찾아내는 것입니다. 예를 들어 입력이 아래와 같은 트리라고 가정해 보겠습니다. 이 경우 출력은 4이며, 색칠된 노드들이 바로 좋은 노드에 해당합니다. 문제 해결 접근 방법 이 문제는 DFS(깊이 우선 탐색)를 활용하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 루트에서 현재 노

  12. C++에서 문장의 단어를 길이순으로 재정렬하는 방법

    문자열 처리 알고리즘 문제 중 하나로, 문장(sentence)의 단어들을 길이 순서대로 재정렬하는 방법을 C++ 코드와 함께 살펴보겠습니다.문제 정의여러 개의 단어로 이루어진 문자열이 있다고 가정해 보겠습니다. 이 문자열을 문장이라고 부르며, 다음과 같은 형식을 따릅니다.첫 글자는 항상 대문자입니다.문장 내 각 단어는 공백 문자 하나로 구분됩니다.우리가 해야 할 일은 문장의 단어들을 길이가 짧은 순서(오름차순)대로 재배열하는 것입니다. 만약 두 단어의 길이가 같다면, 원래 문장에서 등장한 순서를 그대로 유지해야 합니다. 이는 안정

  13. C++ 알고리즘 풀이: 다른 목록의 부분 집합이 아닌 선호 회사 목록을 가진 사람 찾기

    문제 개요 favoriteCompanies라는 배열이 주어집니다. 여기서 favoriteCompanies[i]는 i번째 사람이 선호하는 회사 목록을 의미합니다. 우리가 찾아야 할 것은 자신의 선호 회사 목록이 다른 어떤 사람의 목록에도 부분 집합으로 포함되지 않는 사람들의 인덱스입니다. 예시로 이해하기 입력이 다음과 같다고 가정해 보겠습니다. favoriteCompanies = [[TCS, google, facebook], [google, microsoft], [google, facebook], [google], [amazon]

  14. C++ 알고리즘: 길이 k인 부분 문자열에서 최대 모음 개수 구하기

    문제 소개문자열 s와 정수 k가 주어졌을 때, 길이가 정확히 k인 모든 부분 문자열(substring) 중에서 모음(vowel) 문자가 가장 많이 포함된 경우의 개수를 구하는 문제입니다.예를 들어 입력이 s = abciiidef, k = 3이라면, 길이 3인 부분 문자열 중 iii에 모음이 3개로 가장 많으므로 출력은 3이 됩니다.해결 접근 방법: 슬라이딩 윈도우(Sliding Window)모든 부분 문자열을 매번 새로 검사하면 비효율적입니다. 대신 슬라이딩 윈도우 기법을 사용하면 한 번의 순회로 답을 구할 수 있습니다. 핵심 아이

  15. C++로 해결하는 이진 트리의 의사 회문(Pseudo-Palindromic) 경로 문제

    문제 소개노드 값이 1부터 9 사이의 숫자로 이루어진 이진 트리가 있다고 가정해 보겠습니다. 어떤 경로에 포함된 노드 값들을 재배열했을 때 적어도 하나의 순열이 회문(palindrome)이 된다면, 그 경로를 의사 회문(pseudo-palindromic) 경로라고 부릅니다. 우리가 구해야 할 것은 루트 노드에서 리프(잎) 노드까지 이어지는 모든 경로 중 의사 회문 경로의 개수입니다.예시로 이해하기예를 들어 아래와 같은 이진 트리가 입력으로 주어졌다고 합시다.이때 기대되는 출력은 2입니다. 그 이유를 살펴보면, 루트에서 리프 노드로

  16. C++로 문자열에 길이 K의 모든 이진 코드가 포함되어 있는지 확인하는 방법

    이진 문자열 s와 정수 k가 주어졌을 때, 길이가 k인 모든 이진 코드가 문자열 s의 부분 문자열로 존재하는지 확인하는 문제입니다. 만약 하나라도 존재하지 않는다면 false를 반환해야 합니다.문제 이해하기예를 들어 입력이 S = 00110110, k = 2라고 가정해 보겠습니다. 길이가 2인 이진 코드는 00, 01, 10, 11 네 가지이며, 각각 인덱스 0, 1, 3, 2 위치에서 발견할 수 있습니다. 따라서 이 경우 출력은 true가 됩니다.접근 방법: 슬라이딩 윈도우 + 해시셋이 문제는 슬라이딩 윈도우(sliding win

  17. C++로 해결하는 코스 스케줄 IV(Course Schedule IV)

    문제 이해하기총 n개의 과목을 수강할 수 있으며, 각 과목에는 0부터 n-1까지 번호가 붙어 있다고 가정해 봅시다.일부 과목은 직접적인 선수과목을 가질 수 있습니다. 예를 들어 과목 0을 수강하려면 먼저 과목 1을 수강해야 한다는 조건은 [1,0] 쌍으로 표현됩니다.즉, 과목의 개수 n, 직접적인 선수과목 쌍의 목록(prerequisites), 그리고 질의(query) 쌍의 목록(queries)이 주어졌을 때,각 queries[i]에 대해 과목 queries[i][0]이 과목 queries[i][1]의 선수과목인지 여부를 판단해야

  18. C++로 풀어보는 케이크 자르기 문제: 수평·수직 절단 후 최대 조각 면적 구하기

    문제 개요높이 h, 너비 w를 가진 직사각형 케이크가 있다고 가정해 봅시다. 그리고 두 개의 정수 배열이 주어지는데, horizontalCuts[i]는 케이크 상단에서 i번째 수평 절단선까지의 거리를, verticalCuts[j]는 케이크 왼쪽 변에서 j번째 수직 절단선까지의 거리를 의미합니다.목표는 주어진 모든 위치에서 케이크를 잘랐을 때 생기는 조각 중 가장 넓은 면적을 구하는 것입니다. 결과값이 매우 커질 수 있으므로, 109 + 7로 나눈 나머지를 반환해야 합니다.예시예를 들어 h = 5, w = 4, horizontalCu

  19. C++로 모든 도시가 수도(0번 도시)에 도달하도록 도로 방향 재정렬하는 방법

    0부터 n-1까지 번호가 매겨진 n개의 서로 다른 도시가 있고, 두 도시 사이를 이동할 수 있는 경로가 정확히 하나만 존재하는 n-1개의 도로가 있다고 가정해 보겠습니다. 즉, 전체 도로망은 트리(tree) 구조입니다.교통부는 도로가 너무 좁기 때문에 모든 도로를 일방통행으로 만들기로 결정했습니다. 도로는 connections 배열로 표현되며, connections[i] = [a, b]는 도시 a에서 도시 b로 향하는 일방통행 도로를 의미합니다.그런데 수도인 0번 도시에서 대규모 행사가 열려 많은 사람들이 이곳으로 이동하려고 합니다

  20. C++로 배열에서 가장 강한 k개의 값 찾기

    문제 이해하기숫자 배열 arr와 정수 k가 주어져 있다고 가정해 봅시다. 배열의 중앙값을 m이라 할 때, |arr[i] - m| > |arr[j] - m|이면 arr[i]가 arr[j]보다 강하다(stronger)고 정의합니다. 만약 두 값의 중앙값까지의 거리가 같다면, arr[i] > arr[j]일 때 arr[i]가 더 강한 것으로 간주합니다. 우리의 목표는 배열에서 가장 강한 k개의 값을 찾아 리스트로 반환하는 것입니다.예를 들어 입력이 arr = [1,2,3,4,5], k = 2라면 출력은 [5, 1]입니다. 중앙값

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