숫자로 이루어진 리스트 nums가 있다고 가정해 보겠습니다. 이때 각 nums[i]를 i의 왼쪽에 있는 요소들 중 가장 작은 값으로 교체해야 하며, 첫 번째 요소인 nums[0]은 0으로 대체합니다.문제 예시예를 들어 입력이 다음과 같다면:[15, 7, 9, 16, 12, 25]출력은 아래와 같이 됩니다.[0, 15, 7, 7, 7, 7]출력 결과를 살펴보면, 인덱스 1부터는 해당 위치 왼쪽에 있는 값들 중 최솟값으로 바뀐 것을 확인할 수 있습니다. 인덱스 3 이후에는 왼쪽 원소 중 최솟값인 7이 반복되는 것을 볼 수 있습니다.해결
문제 소개 소문자로만 이루어진 문자열 목록이 주어졌을 때, 목록의 모든 문자열에 공통으로 포함되는 가장 긴 접두사, 즉 최장 공통 접두사(longest common prefix)를 찾아야 합니다. 예를 들어 입력이 [antivirus, anticlockwise, antigravity]라면 세 문자열이 모두 anti로 시작하므로 결과는 anti가 됩니다. 풀이 전략 핵심 아이디어는 한 문자열을 기준으로 삼아 한 글자씩 추가해 가면서, 나머지 모든 문자열과 해당 위치의 문자가 일치하는지 검증하는 것입니다. 단 하나의 문자라도 어긋나면
문자열 s가 주어졌을 때, 동일한 문자가 연속으로 나타나는 가장 긴 부분 문자열(서브스트링)의 길이를 구하는 문제입니다.예를 들어 입력이 abbbaccabbbba라면, b가 네 번 연속으로 등장하는 구간이 있으므로 출력 결과는 4가 됩니다.해결 접근 방법이 문제는 문자열을 한 번만 순회하면서 인접한 두 문자를 비교하는 방식으로 효율적으로 해결할 수 있습니다. 단계별 과정은 다음과 같습니다.문자열 s의 길이가 0이라면 0을 반환합니다.문자열 끝에 공백 한 문자를 추가합니다. 이렇게 하면 마지막 문자 그룹도 비교 로직에서 자연스럽게 처
길이가 n인 두 문자열 s와 t가 있다고 가정해 봅시다. 우리는 s에서 한 문자를, t에서 다른 문자 하나를 골라 서로 교환할 수 있으며, 교환 횟수에는 제한이 없습니다. 이때 두 문자열을 동일하게 만들 수 있는지 확인하는 것이 목표입니다.예를 들어 입력이 s = xy, t = yx라면 출력은 True가 됩니다. x와 y를 한 번만 교환해도 두 문자열을 일치시킬 수 있기 때문입니다.해결 접근 방법이 문제의 핵심 아이디어는 간단합니다. 두 문자열을 합쳤을 때 모든 문자가 짝수 번씩 등장해야만 교환을 통해 두 문자열을 동일하게 만들 수
숫자로 이루어진 리스트 nums가 주어졌을 때, 리스트에서 원소를 최대 하나 제거할 수 있다고 가정해 봅시다. 이때 만들 수 있는 가장 긴 연속된(strictly increasing) 엄격히 증가하는 부분 리스트의 최대 길이를 구하는 것이 이번 문제입니다. 예를 들어 입력이 nums = [30, 11, 12, 13, 14, 15, 18, 17, 32]라면 출력은 7이 됩니다. 값 18을 제거하면 [11, 12, 13, 14, 15, 17, 32]라는 가장 긴 연속 증가 부분 리스트를 얻을 수 있고, 그 길이가 7이기 때문입니다. 풀
문제 설명소문자로만 이루어진 문자열 s가 주어졌을 때, s에 포함된 문자들을 조합하여 만들 수 있는 pizza 문자열의 개수를 구하는 것이 목표입니다. 문자들은 임의의 순서로 재배치할 수 있지만, 각 문자는 한 번만 사용할 수 있다는 점에 유의해야 합니다.예를 들어 입력이 ihzapezlzzilaop라면, pizza 두 개를 만들 수 있을 만큼의 문자가 충분히 포함되어 있으므로 출력은 2가 됩니다.접근 방법pizza는 총 5글자이며, 각 알파벳은 다음과 같이 필요합니다.p: 1개i: 1개z: 2개a: 1개따라서 해결 절차는 다음과
숫자로 이루어진 리스트가 주어졌을 때, 서로 다른 두 요소의 곱 중 가장 큰 값을 찾아야 하는 경우가 자주 있습니다. 예를 들어 입력 리스트가 [5, 3, 7, 4]라면, 가장 큰 곱은 7 × 5 = 35가 됩니다.문제 해결 접근 방식이 문제는 브루트 포스(Brute Force) 방식으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.최댓값을 저장할 변수 curr_max를 음의 무한대(-inf)로 초기화합니다.이중 반복문을 사용하여 리스트 내 모든 서로 다른 두 요소의 조합(i, j)을 확인합니다.두 요소의 곱이 현재 cur
문제 개요숫자로 이루어진 리스트 nums가 주어졌다고 가정해 보겠습니다. 이 리스트를 크기가 같은 두 부분으로 나누되, 각 부분의 중앙값(median)의 절대 차이가 최소가 되도록 만들고, 그 차이를 구하는 것이 목표입니다. 단, 이 문제에서는 리스트 길이의 절반(len(nums) / 2)이 항상 홀수라는 조건이 주어집니다.예시입력이 [2, 10, 8, 5, 4, 7]이라면 결과는 2가 됩니다. 리스트를 [2, 5, 10]과 [4, 7, 8]로 나누면 각각의 중앙값은 5와 7이며, 두 값의 차이는 2이기 때문입니다.풀이 아이디어핵심
정렬되어 있는 두 개의 리스트 A와 B가 있다고 가정해 보겠습니다. 이 두 리스트를 병합하여 하나의 정렬된 리스트 C를 만들어야 하며, 두 리스트의 크기는 서로 달라도 괜찮습니다.예를 들어 A = [1,2,4,7], B = [1,3,4,5,6,8]이라면, 병합된 리스트 C는 [1,1,2,3,4,4,5,6,7,8]이 됩니다.병합 알고리즘의 동작 원리이 문제는 투 포인터(Two Pointer) 기법을 활용해 효율적으로 해결할 수 있습니다. 각 리스트의 첫 번째 요소부터 값을 하나씩 비교하면서, 더 작은 값을 결과 리스트에 순서대로 추가
숫자 리스트 nums가 주어졌을 때, 이 리스트를 오름차순 또는 내림차순 중 어느 방향으로든 정렬하는 데 드는 최소 비용을 구하는 문제입니다. 여기서 비용이란 각 요소의 기존 값과 새로운 값 사이 차이의 절댓값을 모두 더한 합을 의미합니다.예를 들어 입력이 [2, 5, 4]라면 출력은 2가 됩니다.문제 해결 접근 방식이 문제는 다음 단계를 통해 해결할 수 있습니다.원본 배열 nums의 복사본 temp를 만듭니다.temp 리스트를 오름차순으로 정렬합니다.비용 변수 c1과 c2를 0으로 초기화합니다.n은 배열 nums의 크기입니다.i를
숫자로 이루어진 리스트 nums가 주어졌을 때, 리스트 안에서 자신의 값과 출현 빈도가 정확히 일치하는 요소가 존재하는지 확인하는 문제입니다.예를 들어 입력이 [2, 4, 8, 10, 4, 4, 4]라면 출력은 True가 됩니다. 그 이유는 숫자 4가 리스트에 정확히 4번 등장하기 때문입니다.해결 접근 방법이 문제는 다음 단계를 따라 해결할 수 있습니다.각 값의 빈도를 저장할 새로운 딕셔너리(맵) res를 생성합니다.리스트를 순회하면서 각 숫자의 출현 횟수를 계산해 저장합니다.딕셔너리의 각 키-값 쌍 (k, v)를 하나씩 확인합니다
크기가 n인 숫자 리스트 nums가 있다고 가정해 봅시다. 리스트의 모든 숫자는 [1, n] 범위 안에 있으며, 일부 값은 두 번 나타나고 어떤 값은 한 번만 나타날 수 있습니다.이때 우리가 해야 할 일은 리스트에 존재하지 않는 [1, n] 범위의 숫자를 모두 찾아 오름차순으로 정렬하여 반환하는 것입니다. 조건은 선형 시간(O(n))과 상수 공간에 가까운 효율적인 해법을 찾는 것입니다.문제 예시입력이 [4, 4, 2, 2, 6, 6]이라면, 1~6 범위에서 실제로 등장한 숫자는 2, 4, 6뿐입니다. 따라서 출력은 [1, 3, 5]
숫자로 이루어진 리스트 nums가 주어졌을 때, 다음 세 가지 조건을 만족하도록 배열을 정렬하는 문제입니다.짝수는 오름차순으로 정렬합니다.홀수는 내림차순으로 정렬합니다.짝수와 홀수의 상대적인 위치(인덱스 순서)는 절대 변경되지 않아야 합니다.예를 들어 입력이 [9, 14, 12, 91, -4, 5]라면 출력은 [91, -4, 12, 9, 14, 5]가 됩니다.문제 해결 접근 방법핵심 아이디어는 간단합니다. 짝수와 홀수를 각각 분리한 뒤 원하는 방향으로 정렬하고, 원래 배열에서 짝수였던 자리에는 정렬된 짝수를, 홀수였던 자리에는 정렬
어떤 숫자 n이 주어졌을 때, 이 숫자가 자기애적 수(Narcissistic Number)인지 판별하는 문제를 살펴보겠습니다.자기애적 수란 각 자릿수를 자릿수의 개수만큼 거듭제곱한 값의 합이 원래 숫자와 같아지는 수를 말합니다. 예를 들어 입력값이 9474라면 결과는 True입니다. 그 이유는 다음과 같습니다.9⁴ + 4⁴ + 7⁴ + 4⁴ = 6561 + 256 + 2401 + 256 = 9474해결 접근 방법이 문제는 다음 단계를 통해 해결할 수 있습니다.숫자 n을 문자열로 변환하여 각 자릿수를 리스트로 만듭니다.각 자릿수 x에
이진 탐색 트리(BST)가 주어지고, 왼쪽 경계 l과 오른쪽 경계 r이 함께 제공된다고 가정해 봅시다. 이때 루트 노드를 기준으로 값이 l 이상 r 이하(경계값 포함)인 모든 노드의 개수를 구하는 것이 목표입니다.예를 들어 다음과 같은 BST가 있다고 가정해 보겠습니다.여기서 l = 7, r = 13이라면, 값이 7 이상 13 이하인 노드는 8, 10, 12로 총 3개이므로 출력 결과는 3이 됩니다.문제 해결 접근 방법이 문제는 스택을 활용한 반복적 순회(iterative traversal) 방식으로 효율적으로 해결할 수 있습니다.
문제 개요크기가 n × n인 체스판이 주어졌다고 가정해 보겠습니다. 이때 n개의 룩(rook)을 배치하되, 어떤 룩도 다른 룩을 공격할 수 없도록 하는 배치 방법의 수를 구해야 합니다.룩은 같은 행(row) 또는 같은 열(column)에 있는 기물을 공격할 수 있습니다. 따라서 모든 룩이 서로 다른 행과 서로 다른 열에 위치해야 합니다. 또한 두 가지 배치 방법 중 어느 하나라도 특정 칸의 점유 여부가 다르다면, 그 두 방법은 서로 다른 것으로 간주합니다.예를 들어 입력값이 3이라면, 출력은 6이 됩니다.풀이 접근 방법핵심 아이디어
피보나치 수열은 프로그래밍을 배울 때 가장 먼저 접하는 고전적인 문제 중 하나입니다. 이 글에서는 숫자 n이 주어졌을 때 n번째 피보나치 항을 구하는 방법을 단계별로 알아보겠습니다.피보나치 수열이란?피보나치 수열은 각 항이 바로 앞의 두 항의 합으로 정의되는 수열입니다. 즉, i번째 피보나치 항은 다음과 같은 점화식으로 표현됩니다.f(i) = f(i-1) + f(i-2)수열의 첫 두 항은 각각 0과 1로 시작합니다. 따라서 전체 수열은 다음과 같습니다.0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...문제 예시예를 들
숫자 n이 주어졌을 때, 그 숫자를 이진수(binary)로 표현했을 때 포함된 1의 비트 개수를 구하는 문제입니다.예를 들어 입력값이 12라면, 12의 이진수 표현은 1100이므로 출력 결과는 2가 됩니다.문제 해결 접근 방법이 문제는 비트 연산을 활용하면 간단하게 해결할 수 있습니다. 다음 단계를 따릅니다:카운트 변수를 0으로 초기화합니다.n이 0이 아닌 동안 반복합니다:현재 n과 1을 비트 AND(&) 연산하여 가장 오른쪽 비트가 1인지 확인하고, 그 결과를 카운트에 더합니다.n을 오른쪽으로 한 비트 시프트(즉, 2로 나
문제 설명서로 다른 고유한 값을 가진 이진 트리와 정수 k가 주어졌다고 가정해 보겠습니다. 이때 트리 안에서 길이가 k인 고유한 경로의 개수를 구해야 합니다. 경로는 부모 노드에서 자식 노드 방향으로 내려갈 수도 있고, 반대로 자식 노드에서 부모 노드 방향으로 거슬러 올라갈 수도 있습니다. 두 경로를 비교했을 때 한쪽에만 포함된 노드가 하나라도 존재한다면, 그 두 경로는 서로 다른 경로로 간주합니다.예를 들어 다음과 같은 트리가 주어지고,k = 3이라면 출력은 4가 됩니다. 해당하는 경로가 [12,8,3], [12,8,10], [8
문제 소개소문자로만 구성된 문자열 s가 주어졌을 때, 단 하나의 고유한 문자만 포함하는 부분 문자열(substring)의 총 개수를 구하는 것이 목표입니다.예를 들어 입력 문자열이 xxyy라면, 조건을 만족하는 부분 문자열은 [x, x, xx, y, y, yy]로 총 6개이므로 결과값은 6이 됩니다.해결 아이디어핵심은 문자열을 왼쪽에서 오른쪽으로 한 글자씩 살펴보면서 같은 문자가 연속해서 나타나는 구간(run)의 길이를 추적하는 것입니다.어떤 위치까지 같은 문자가 k번 연속되었다면, 그 위치를 끝으로 하는 유효한 부분 문자열은 정확