문제 이해하기 배열 nums가 주어졌을 때, 이를 left와 right라는 두 개의 하위 배열로 분할하려고 합니다. 단, 다음 세 가지 조건을 반드시 만족해야 합니다. left의 모든 원소는 right의 모든 원소보다 작거나 같아야 합니다. left와 right는 모두 비어 있으면 안 됩니다. left의 크기는 가능한 한 가장 작아야 합니다. 이러한 조건대로 분할했을 때, left의 길이를 구하는 것이 이 문제의 핵심입니다. 예를 들어 입력이 [5, 0, 3, 8, 6]이라면 결과는 3입니다. left가 [5, 0, 3], ri
세 개의 값 n, index, maxSum이 주어졌다고 가정해 봅시다. 우리는 아래 조건을 모두 만족하는 배열 nums에서 nums[index]가 가질 수 있는 최댓값을 구해야 합니다. 배열 nums의 크기는 정확히 n입니다. 배열의 모든 요소는 양수여야 합니다. 인접한 두 요소의 차이는 1 이하입니다. 즉, 모든 i(0 ≤ i < n-1)에 대해 |nums[i] − nums[i+1]| ≤ 1을 만족합니다. 배열 요소들의 총합은 maxSum을 초과하지 않습니다. nums[index]의 값이 최대화되어야 합니다. 예시 입력이
nums라는 이름의 배열이 주어졌을 때, 이 배열을 오름차순 또는 내림차순 중 어느 한쪽이라도 정렬된 상태로 만들기 위해 필요한 스왑(교환) 횟수의 최솟값을 구해야 합니다.예를 들어 입력이 nums = [2, 5, 6, 3, 4]라고 가정해 보겠습니다. 이 경우 출력은 2가 됩니다. 처음 배열은 [2, 5, 6, 3, 4]입니다. 먼저 6과 4를 교환하면 [2, 5, 4, 3, 6]이 되고, 이어서 5와 3을 교환하면 [2, 3, 4, 5, 6]이 됩니다. 따라서 배열을 오름차순으로 정렬하는 데 총 2번의 스왑이 필요합니다.문제 해
이번 글에서는 길이가 N인 숫자 중에서 연속된 두 자릿수의 절대 차이가 항상 K가 되는 모든 숫자를 찾는 프로그램을 파이썬으로 구현해 보겠습니다. 단, 정답에 포함되는 숫자는 0 자체를 제외하고 맨 앞자리가 0으로 시작해서는 안 된다는 조건이 있습니다. 예를 들어 입력이 N = 4, K = 7이라면 출력은 다음과 같습니다. [1818, 2929, 7070, 8181, 9292] 여기서 0707은 실제로 조건을 만족하지만 맨 앞자리가 0으로 시작하기 때문에 유효하지 않은 숫자로 제외됩니다. 문제 해결 접근 방법 이 문제는 너
문자열 s에 괄호 (, )와 영어 소문자가 섞여 있다고 가정해 봅시다. 이때 임의의 위치에서 여는 괄호 또는 닫는 괄호를 최소 개수만큼 삭제하여 결과 문자열이 유효한(valid) 괄호 문자열이 되도록 만들고, 그 결과로 얻을 수 있는 유효한 문자열 하나를 반환해야 합니다.여기서 괄호 문자열이 유효하다는 것은 다음 조건 중 하나를 만족하는 경우를 말합니다.문자열이 비어 있거나 소문자만 포함하는 경우문자열이 AB 형태(A와 B의 연결)로 표현될 수 있고, A와 B가 모두 유효한 문자열인 경우문자열이 (A) 형태로 표현될 수 있고, A가
문자열 형태로 주어진 숫자가 있을 때, 해당 숫자의 모든 부분 문자열(substring)의 합을 구하는 문제를 살펴보겠습니다. 결과값이 매우 커질 수 있으므로, 최종 답은 109+7로 나눈 나머지를 반환해야 합니다.예를 들어 입력이 s = 268이라면, 만들 수 있는 부분 문자열은 2, 6, 8, 26, 68, 268이고, 이들의 총합은 다음과 같습니다.2 + 6 + 8 + 26 + 68 + 268 = 378문제 해결 접근 방법모든 부분 문자열을 직접 생성하면 시간 복잡도가 급격히 증가하므로, 각 자릿수가 전체 합에 기여하는 정도를
문제 개요두 문장 s와 t가 주어졌을 때, 이 두 문장이 유사한지 판별하는 프로그램을 만들어 보겠습니다. 여기서 문장은 영어 알파벳으로만 구성된다고 가정합니다.두 문장이 유사하다는 것은, 한 문장의 임의의 위치에 다른 문장(빈 문장도 허용)을 삽입했을 때 두 문장이 완전히 같아질 수 있는 경우를 의미합니다.예를 들어, 입력이 s = "we live at city Kolkata", t = "city Kolkata"라면 결과는 True입니다. t의 앞부분에 "we live at"이라
문제 개요시(hour)와 분(minute)이라는 두 개의 입력값이 주어졌을 때, 해당 시각을 영어 텍스트 형식으로 출력하는 프로그램을 작성해 보겠습니다. 영어에서는 시각을 다음과 같이 특수한 방식으로 표현합니다.8:00 → eight o clock (여덟 시 정각)8:01 → one minute past eight (여덟 시 1분 지남)8:10 → ten minutes past eight (여덟 시 10분 지남)8:15 → quarter past eight (여덟 시 15분, quarter는 15분을 의미)8:30 → half pa
문제 개요 음이 아닌 정수로 구성된 배열 nums가 주어졌을 때, 배열에 존재하는 좋은 쌍(nice pair)의 개수를 구하는 프로그램을 작성해 보겠습니다. 답이 매우 커질 수 있으므로, 최종 결과는 10^9 + 7로 나눈 나머지를 반환해야 합니다. 인덱스 쌍 (i, j)가 다음 두 조건을 모두 만족할 때 좋은 쌍이라고 정의합니다. 0 <= i < j < nums의 길이 nums[i] + rev(nums[j]) == nums[j] + rev(nums[i]) 참고: rev() 함수는 정수의 숫자만 뒤집습니다. 예를
문자열 s가 주어졌을 때, 이 문자열과 자기 자신의 모든 접미사(suffix) 사이의 유사도 합계를 구하는 문제입니다. 여기서 두 문자열 간의 유사도란 두 문자열이 공통으로 가지는 가장 긴 접두사(prefix)의 길이를 의미합니다. 문제 예시 입력이 s = pqpqpp라고 가정해 보겠습니다. 이 문자열의 접미사는 pqpqpp, qpqpp, pqpp, qpp, pp, p로 총 6개이며, 각 접미사와 원본 문자열 pqpqpp의 유사도는 순서대로 6, 0, 3, 0, 1, 1입니다. 따라서 전체 합계는 다음과 같습니다. 6 + 0 + 3
문제 설명 두 개의 문자열 s와 t가 주어져 있다고 가정해 봅시다. 다음 규칙에 따라 merge라는 새로운 문자열을 만들어야 합니다. s 또는 t 중 하나라도 비어 있지 않은 동안, 아래 작업 중 하나를 반복적으로 수행합니다. s가 비어 있지 않으면, s의 첫 번째 문자를 merge 끝에 추가하고 s에서 제거합니다. t가 비어 있지 않으면, t의 첫 번째 문자를 merge 끝에 추가하고 t에서 제거합니다. 목표는 이렇게 만들 수 있는 병합 결과 중 사전순(lexicographically)으로 가장 큰 문자열을 찾는 것입니다. 예
알고리즘 문제를 풀다 보면 배열 사이의 차이를 최소화해야 하는 상황을 자주 만나게 됩니다. 이번 글에서는 절대 합 차이(Absolute Sum Difference) 개념과, nums1 배열의 원소를 최대 한 번만 교체할 수 있을 때 이 값을 최소화하는 파이썬 풀이법을 알아보겠습니다.문제 정의같은 크기를 가진 두 개의 양수 배열 nums1과 nums2가 주어집니다. 이때 두 배열의 절대 합 차이는 다음과 같이 정의됩니다.|nums1[i] - nums2[i]| 의 합 (0 <= i < n, 0-인덱스 기준)여기서 우리는 nu
문제 소개 배열 nums와 정수 k가 주어졌다고 가정해 봅시다. 이때 nice 부분 배열의 개수를 구하는 것이 목표입니다. 부분 배열(subarray) 안에 정확히 k개의 홀수가 포함되어 있으면, 그 부분 배열을 nice 부분 배열이라고 정의합니다. 예를 들어, 입력이 nums = [1,1,2,1,1], k = 3이라면 출력은 2가 됩니다. 조건을 만족하는 부분 배열이 [1,1,2,1]과 [1,2,1,1] 두 개뿐이기 때문입니다. 접근 방법 이 문제는 다음 단계를 통해 해결할 수 있습니다. 홀수의 위치(인덱스)를 저장할 새 리스
수열 X_1, X_2, ..., X_n이 다음 조건을 만족하면 피보나치 유사(fibonacci-like) 수열이라고 정의합니다.n >= 3모든 i + 2 <= n에 대해 X_i + X_i+1 = X_i+2 성립엄격하게 증가하는 배열 A가 하나의 수열을 이룬다고 할 때, A에서 가장 긴 피보나치 유사 부분 수열의 길이를 구해야 합니다. 만약 그러한 수열이 존재하지 않는다면 0을 반환합니다.예를 들어 입력이 A = [1,2,3,4,5,6,7,8]이라면 출력은 5가 됩니다. 이는 길이가 5인 수열 [1,2,3,5,8]이 존재하
크기가 n인 배열 nums와 하나의 값 m이 주어져 있다고 가정해 보겠습니다. 우리는 다음과 같은 작업을 n번 반복해서 수행해야 합니다.nums의 모든 원소와 k를 XOR 연산했을 때 결과가 최대가 되는 음이 아닌 정수 k(단, k < 2m)를 찾습니다. 이때 찾은 k가 i번째 쿼리의 답이 됩니다.현재 배열 nums에서 마지막 원소를 제거합니다.answer[i]가 i번째 쿼리의 답이 되도록 배열 answer를 완성합니다.예를 들어 입력이 nums = [0,1,1,3], m = 2라면 출력은 [0,3,2,3]이 됩니다. 그 과정
코딩 테스트에서 자주 등장하는 대표적인 그리디(Greedy) 문제를 Python으로 해결해 보겠습니다. 길이가 n인 costs 배열이 주어지며, 여기서 costs[i]는 i번째 아이스크림 막대의 가격을 의미합니다. 우리에게는 처음에 c개의 동전이 있으며, 이 동전으로 최대한 많은 아이스크림을 구매하는 것이 목표입니다.예를 들어 입력이 costs = [3,1,4,5,2], c = 10이라면 출력은 4가 됩니다. 인덱스 0, 1, 2, 4에 해당하는 아이스크림을 구매하면 총 가격이 3 + 1 + 4 + 2 = 10이 되어 정확히 예산
문제 이해하기배열 nums와 정수 k가 주어졌다고 가정해 봅시다. 한 번의 연산에서는 nums의 인덱스를 하나 선택하여 해당 위치의 요소를 1만큼 증가시킬 수 있습니다. 우리의 목표는 최대 k번의 연산을 수행한 후 얻을 수 있는 특정 요소의 최대 빈도(maximum frequency)를 구하는 것입니다.예를 들어, nums = [8, 3, 6], k = 9인 경우를 살펴보겠습니다. 값 3을 5번 증가시키고, 값 6을 2번 증가시키면 배열이 [8, 8, 8]이 됩니다. 총 7번의 연산으로 세 요소가 모두 같아지므로, 이 경우 최대 빈
문제 개요영어 모음으로만 이루어진 문자열 s가 주어졌을 때, 가장 긴 아름다운(beautiful) 부분 문자열의 길이를 찾는 프로그램을 작성해 보겠습니다. 만약 조건을 만족하는 부분 문자열이 존재하지 않는다면 0을 반환해야 합니다.문자열이 아름다운 문자열이 되려면 다음 두 가지 조건을 충족해야 합니다.5개의 모음(a, e, i, o, u)이 각각 최소 한 번 이상 나타나야 합니다.문자들이 알파벳 순서(a → e → i → o → u)로 정렬되어 있어야 합니다.예를 들어 입력이 s = "aaioaaaaeiiouuooaauu&
배열 nums와 하나의 값 goal이 주어져 있다고 가정해 보겠습니다. 우리의 목표는 nums에서 부분 수열(subsequence)을 선택하여 그 합이 goal에 최대한 가깝도록 만드는 것입니다. 즉, 선택한 부분 수열의 합을 s라고 할 때, 절대 차이 |s - goal|를 최소화해야 합니다.예를 들어, 입력이 nums = [8,-8,16,-1], goal = -3이라면 출력은 2가 됩니다. 부분 수열 [8,-8,-1]을 선택하면 합이 -1이 되고, 이때 절대 차이는 |-1 - (-3)| = 2로 가능한 최솟값입니다.해결 접근 방법
두 문자열 s와 t가 있다고 가정해 보겠습니다. 문자열 s 안에서 두 글자의 위치를 정확히 K번 교환(swap)했을 때 결과가 t와 같아진다면, s와 t는 K-유사(K-similar)하다고 정의합니다. 즉, 서로 애너그램(anagram) 관계인 두 문자열 s와 t가 주어졌을 때, 두 문자열이 K-유사가 되도록 만드는 가장 작은 K를 구하는 것이 이 문제의 목표입니다. 예를 들어 s = abc, t = bac라면, 첫 번째 문자 a와 두 번째 문자 b를 단 한 번만 바꾸면 되므로 출력은 1이 됩니다. 해결 전략: 너비 우선 탐색(BF