문제 개요 이진 탐색 트리(Binary Search Tree, BST)가 하나 주어져 있다고 가정해 봅시다. 이 트리를 Greater Tree(그레이터 트리)로 변환해야 하며, 변환 규칙은 다음과 같습니다. 원래 BST의 모든 노드 값을 원래 키 값 + BST에서 그 키보다 큰 모든 키의 합으로 변경하는 것입니다. 예를 들어 입력 트리가 다음과 같다면, 출력 결과는 다음과 같습니다. 접근 방법: 역중위 순회(Reverse Inorder) BST에서 일반적인 중위 순회(왼쪽 → 루트 → 오른쪽)를 수행하면 노드 값이 오름차순으로
다양한 프로그래밍 플랫폼에는 reshape라는 매우 유용한 함수가 존재합니다. 이 함수는 행렬의 데이터는 그대로 유지한 채, 크기만 다른 새로운 행렬로 변환해 주는 역할을 합니다.예를 들어, 하나의 행렬과 원하는 재구성 행렬의 행 개수 r, 열 개수 c가 주어졌다고 가정해 보겠습니다. 입력이 [[5,10],[15,20]]이고 row = 1, col = 4라면, 출력은 다음과 같습니다.[[5, 10, 15, 20]]해결 접근 방법이 문제는 다음 단계를 따라 해결할 수 있습니다.1차원 임시 배열 temp를 정의합니다.크기가 r × c인
문제 설명짝수 길이의 배열이 하나 주어져 있다고 가정해 봅시다. 배열 안의 서로 다른 숫자는 서로 다른 종류의 사탕을 의미하며, 각 숫자 하나는 해당 종류의 사탕 한 개를 나타냅니다. 우리는 이 사탕들을 오빠와 여동생에게 수량상 동일하게 나누어 주어야 하고, 이때 여동생이 받을 수 있는 사탕 종류의 최대 개수를 구하는 것이 목표입니다.예를 들어 입력이 [1,1,2,3]이라면 출력은 2가 됩니다. 여동생에게 [2,3]을, 오빠에게 [1,1]을 나누어 주면, 여동생은 두 가지 종류의 사탕을 갖게 되지만 오빠는 한 가지 종류만 갖게 됩니
n-ary 트리(N-ary Tree)가 하나 주어졌을 때, 모든 노드의 전위 순회(preorder traversal) 결과를 구하는 문제입니다.예를 들어 아래와 같은 트리가 입력으로 주어진다면,출력은 [1, 3, 5, 6, 2, 4]가 됩니다.풀이 접근 방법전위 순회는 루트를 먼저 방문한 뒤, 각 자식 노드를 왼쪽에서 오른쪽 순서로 재귀적으로 방문하는 방식입니다. 이 개념을 바탕으로 다음 단계로 문제를 해결할 수 있습니다.순회 결과를 저장할 배열 ans를 정의합니다.preorder() 메서드를 정의하며, 이 메서드는 루트 노드를 인
정수 배열이 주어졌을 때, 가능한 모든 부분 수열(subsequence) 중에서 가장 긴 조화 부분 수열(harmonious subsequence)의 길이를 구하는 문제입니다.여기서 조화 부분 수열이란 배열 안에 있는 값들 중 최댓값과 최솟값의 차이가 정확히 1인 수열을 의미합니다.예를 들어 입력이 [1,3,2,2,5,2,3,7]이라면 출력은 5가 됩니다. 이는 가장 긴 조화 부분 수열이 [3,2,2,2,3]이며, 그 길이가 5이기 때문입니다.문제 해결 접근 방법이 문제는 해시 기반 맵(hash map)을 활용해 각 숫자의 등장 횟
문제 이해하기m × n 크기의 행렬 M이 있으며, 초기에는 모든 원소가 0으로 채워져 있다고 가정해 봅시다. 그리고 여러 개의 갱신(update) 연산이 주어집니다.각 연산은 2차원 배열의 형태로 표현되며, 두 개의 양수 a와 b를 담고 있습니다. 이 연산은 행렬에서 i가 0부터 a-1까지, j가 0부터 b-1까지인 모든 위치 M[i][j]의 값을 1씩 증가시킨다는 의미입니다.모든 연산을 수행한 후, 행렬에 존재하는 최댓값의 개수를 구하는 것이 우리의 목표입니다.예제 살펴보기예를 들어 m = 3, n = 3이고 operations
문제 개요 두 친구 아말과 비말이 저녁 식사를 함께할 레스토랑을 정하려고 합니다. 두 사람은 각각 문자열로 표현된 좋아하는 레스토랑 목록을 가지고 있으며, 우리는 이들 사이의 공통 관심사를 인덱스 합이 가장 작은 기준으로 찾아야 합니다. 만약 인덱스 합이 같은 후보가 여러 개라면 순서에 상관없이 모두 반환하면 됩니다. 예를 들어, 입력이 다음과 같다고 가정해 보겠습니다. 리스트 1: [ABC, PQR, MNO, XYZ] 리스트 2: [TUV, GHI, KLM, ABC] 두 리스트에 공통으로 등장하는 레스토랑은 ABC뿐이며, 인
문제 개요길게 이어진 화단이 있다고 가정해 보겠습니다. 화단의 일부 구역에는 이미 꽃이 심어져 있고, 나머지 구역은 비어 있습니다. 여기에는 한 가지 중요한 규칙이 있습니다. 바로 인접한 구역에는 꽃을 심을 수 없다는 것입니다. 서로 붙어 있는 두 꽃은 물을 두고 경쟁하게 되어 결국 둘 다 시들어 버리기 때문입니다.따라서 화단의 상태는 0과 1로 이루어진 배열로 주어집니다(0은 빈 구역, 1은 꽃이 심긴 구역). 여기에 숫자 n이 함께 주어질 때, 인접 금지 규칙을 어기지 않으면서 n개의 새 꽃을 심을 수 있는지 판별하는 것이 이
문제 설명정수 배열이 하나 주어졌을 때, 그중 세 개의 숫자를 골라 곱했을 때 가장 큰 값이 되는 경우를 찾고, 그 최대 곱을 반환하는 것이 목표입니다.예를 들어 입력이 [1, 1, 2, 3, 3]이라면, 세 원소 [2, 3, 3]을 선택했을 때 곱이 18로 가장 크므로 출력은 18이 됩니다.접근 방법이 문제는 배열을 정렬한 뒤 두 가지 후보만 비교하면 간단히 해결할 수 있습니다.배열 nums를 오름차순으로 정렬합니다.l := nums의 크기a := nums[l - 1], b := nums[l - 2], c := nums[l - 3
음이 아닌 정수 c가 주어졌을 때, 다음 조건을 만족하는 두 정수 a와 b가 존재하는지 판별하는 문제입니다.a² + b² = c예를 들어 입력이 61이라면, 61 = 5² + 6²이 성립하므로 출력은 True(참)가 됩니다.문제 해결 접근 방법이 문제는 완전 제곱수(perfect square) 판별 함수를 활용해 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.먼저 어떤 수가 완전 제곱수인지 확인하는 함수 isPerfect()를 정의합니다.해당 함수는 인자로 받은 값 x에 대해 제곱근을 구한 뒤, 소수 부분이 없는지(즉, 제곱
문제 개요비어 있지 않은(non-empty) 이진 트리가 하나 주어졌다고 가정해 보겠습니다. 우리가 해야 할 일은 트리의 각 레벨(level, 층)에 있는 노드 값들의 평균을 계산한 뒤, 그 평균값들을 배열 형태로 반환하는 것입니다.예를 들어 입력으로 다음과 같은 이진 트리가 주어진다면,출력은 [3, 14.5, 11]이 됩니다.첫 번째 레벨에는 루트 노드 3만 존재하므로 평균은 3입니다.두 번째 레벨의 노드 값은 9와 20이므로 평균은 (9 + 20) / 2 = 14.5입니다.세 번째 레벨의 노드 값은 15와 7이므로 평균은 (15
문제 개요 n개의 원소로 이루어진 배열이 주어졌을 때, 길이가 k인 연속된 부분 배열 중에서 평균값이 가장 큰 경우를 찾아 그 최대 평균값을 반환하는 것이 이번 문제의 목표입니다. 예를 들어 입력 배열이 [1, 13, -5, -8, 48, 3]이고 k = 4라고 가정해 보겠습니다. 이때 (13 + (-5) + (-8) + 48) / 4 = 12.0이므로 결과는 12.0이 됩니다. 접근 방법: 슬라이딩 윈도우 가능한 모든 부분 배열을 일일이 계산하는 브루트 포스 방식은 비효율적입니다. 대신 슬라이딩 윈도우(Sliding Window)
문제 소개 원래 집합 S에는 1부터 n까지의 숫자가 모두 포함되어 있다고 가정해 봅시다. 그런데 안타깝게도 어떤 오류 때문에 집합의 한 숫자가 다른 숫자 자리에 복제되어 들어갔고, 그 결과 한 숫자는 두 번 나타나고 다른 한 숫자는 사라지고 말았습니다. 오류가 발생한 이후의 집합 상태를 나타내는 배열 nums가 주어졌을 때, 우리의 과제는 두 번 등장하는 숫자와 빠진 숫자를 각각 찾아 배열 형태로 반환하는 것입니다. 예를 들어 입력이 [1, 2, 3, 4, 4, 6]이라면 출력은 [4, 5]가 됩니다. 여기서 4는 중복된 숫자이고
문제 소개 이진 탐색 트리(Binary Search Tree, BST)와 하나의 목표값(target)이 주어졌을 때, 트리 내에 존재하는 두 원소의 합이 목표값과 같아지는 경우가 있는지 확인하는 문제입니다. 예를 들어 아래와 같은 BST가 입력으로 주어지면, 목표값이 9일 때 5+4=9 또는 6+3=9가 성립하므로 출력은 True가 됩니다. 해결 전략 이 문제는 크게 두 단계로 나누어 접근할 수 있습니다. 중위 순회(Inorder Traversal): BST를 중위 순회하면 값들이 오름차순으로 정렬된 배열을 얻을 수 있습니다.
로봇이 좌표 평면 위의 시작점 (0, 0)에서 출발한다고 가정해 봅시다. 로봇의 이동 순서가 문자열로 주어졌을 때, 모든 이동을 마친 후 로봇이 다시 원점 (0, 0)으로 돌아오는지 판별하는 것이 이 문제의 목표입니다.문제 설명이동 순서는 문자열 형태로 주어지며, 각 문자는 로봇의 i번째 이동을 나타냅니다.R: 오른쪽으로 한 칸 이동L: 왼쪽으로 한 칸 이동U: 위쪽으로 한 칸 이동D: 아래쪽으로 한 칸 이동모든 이동이 끝난 후 로봇이 원점에 도달했다면 true를, 그렇지 않다면 false를 반환해야 합니다.예를 들어 입력이 RRU
문제 개요2차원 행렬 M이 이미지의 그레이스케일 값을 나타낸다고 가정해 보겠습니다. 이때 각 픽셀의 밝기를, 자기 자신을 포함한 주변 8개 픽셀의 평균값(소수점 이하는 버림)으로 바꾸는 이미지 스무더(Smoother)를 설계해야 합니다. 만약 어떤 셀의 주변에 8개보다 적은 셀이 있다면, 존재하는 모든 유효한 픽셀만을 대상으로 계산합니다.입력 예시111101111출력 결과000000000가운데 값 0을 기준으로 계산하면, 주변 8개 픽셀과 자기 자신의 합은 8이고 개수는 9이므로 8 ÷ 9 = 0.88...에서 버림하여 0이 됩니다
이 문제에서는 정수 배열 arr[]과 숫자 k가 주어지며, 크기가 k인 부분 수열(subsequence) 중에서 원소들의 곱이 가장 커지는 값을 찾는 프로그램을 C++로 작성하는 것이 목표입니다.문제 설명주어진 배열에서 크기가 k(1 ≤ k ≤ n)인 부분 수열을 선택했을 때, 그 원소들을 모두 곱한 값이 최대가 되는 경우를 구해야 합니다.예제로 이해해 보기입력arr[] = {1, 5, 6, -2, 0, 4} , k = 3출력120설명크기가 3인 부분 수열 중 곱이 가장 큰 것은 (5, 6, 4)이며, 그 곱은 120입니다.해결 접
이 문제에서는 n개의 노드를 가진 무방향 연결 트리 T가 주어집니다. 우리의 목표는 C++을 이용해 이 트리 안에서 서로 교차하지 않는 두 경로(non-intersecting paths)의 길이 곱의 최댓값을 찾는 프로그램을 작성하는 것입니다.문제 설명트리 내에서 서로 겹치지 않는 모든 경로 쌍을 찾고, 각 경로의 길이를 곱한 값 중 가장 큰 값을 구해야 합니다.예제로 이해하기입력그래프 —출력8설명교차하지 않는 경로 쌍으로 C-A-B와 F-E-D-G-H가 선택됩니다.두 경로의 길이는 각각 2와 4이며, 따라서 곱은 2 × 4 = 8
문제 개요 이 문제에서는 배열 arr[]이 주어지며, 우리의 목표는 배열에서 곱이 최대가 되는 4개 원소 조합(크기 4의 부분 수열, 쿼드러플)을 찾는 프로그램을 C++로 작성하는 것입니다. 문제 설명 — 주어진 배열에서 네 개의 원소를 선택했을 때 그 곱이 최대가 되는 조합을 찾아야 합니다. 예시를 통해 문제를 자세히 살펴보겠습니다. 입력 arr[] = {4, -2, 5, -6, 8} 출력 480 설명 네 원소 (-6, -2, 5, 8)를 선택했을 때 곱이 480이 되어, 가능한 모든 조합 중 가장 큰 값을 얻습니다. 해결
이 문제에서는 정수로 이루어진 배열 arr[]가 주어지며, C++를 사용해 두 번의 순회(Two Traversals) 방식으로 최대 곱 부분 배열(Maximum Product Subarray)을 찾는 프로그램을 작성하는 것이 목표입니다.문제 설명주어진 배열에서 인덱스 0부터 시작하는 순회(왼쪽 → 오른쪽)와 인덱스 n-1부터 시작하는 순회(오른쪽 → 왼쪽), 총 두 번의 순회를 이용해 곱이 가장 큰 부분 배열의 값을 구합니다.예제로 문제 이해하기입력arr[] = {4, -2, 5, -6, 0, 8}출력240설명부분 배열 = {4,