문제 개요소문자(ASCII 문자)로만 이루어진 문자열이 주어졌을 때, 해당 문자열 안에서 회문(palindrome)이 되는 연속된 부분 문자열이 모두 몇 개 있는지 찾는 문제입니다.예를 들어 입력 문자열이 level이라면 출력은 7이 됩니다. [level, eve, l, e, v, e, l]과 같이 일곱 개의 회문 부분 문자열이 존재하기 때문입니다.해결 알고리즘이 문제는 다음 단계를 따라 해결할 수 있습니다.N := 26 (알파벳 개수)n := 문자열의 길이sum := 0 (결과를 저장할 변수)my_map := 크기가 N인 리스트를
문제 개요모든 문자가 소문자로 이루어진 문자열 S가 주어졌을 때, 각 문자를 임의로 재배열했을 때 단어 bird가 되는 길이 4짜리 부분 문자열(substring)이 몇 개 존재하는지 구하는 문제입니다.예를 들어 입력 문자열이 birdb라면, 인덱스 0에서 시작하는 bird와 인덱스 2에서 시작하는 rdbi(재배열하면 bird) 두 곳이 조건을 만족하므로 출력은 2가 됩니다.해결 접근 방법핵심 아이디어는 간단합니다. 문자열을 처음부터 끝까지 순회하면서 길이 4짜리 윈도우를 하나씩 검사하고, 해당 윈도우에 b, i, r, d가 정확히
문제 상황달리기 대회를 개최한다고 가정해 보겠습니다. 도로 위에는 여러 개의 돌이 놓여 있고, 출발 지점에는 양동이 하나가 있습니다. 양동이는 첫 번째 돌에서 6단위 떨어져 있으며, 나머지 돌들은 서로 4단위씩 간격을 두고 일직선상에 차례로 배치되어 있습니다.참가자는 양동이에서 출발하여 가장 가까운 돌을 집어 들고 양동이로 되돌아와 돌을 넣은 뒤, 다시 다음으로 가까운 돌을 가지러 달려갑니다. 이 과정을 모든 돌이 양동이에 담길 때까지 반복합니다. 돌이 n개 있다면, 참가자가 이동해야 하는 총 거리를 구해야 합니다.예를 들어 n =
배열이 하나 주어졌을 때, 자신의 왼쪽에 있는 모든 요소는 자신보다 작고, 오른쪽에 있는 모든 요소는 자신보다 큰 지점 역할을 하는 요소를 찾아야 합니다. 그러한 요소가 존재하면 해당 인덱스를 반환하고, 존재하지 않으면 -1을 반환합니다.예를 들어 입력 배열이 [6, 2, 5, 4, 7, 9, 11, 8, 10]이라면, 인덱스 4에 있는 값 7이 왼쪽 요소들(6, 2, 5, 4)보다 크고 오른쪽 요소들(9, 11, 8, 10)보다 작으므로 결과는 4가 됩니다.문제 해결 접근법이 문제는 왼쪽에서부터의 누적 최댓값과 오른쪽에서부터의 누
문자 스트림 또는 하나의 문자열이 주어졌을 때, 그 안에서 첫 번째로 한 번만 등장하는(비반복) 문자를 찾는 문제를 생각해 봅시다. 예를 들어 문자열이 people이라면, 한 번만 나타나는 첫 번째 문자는 o입니다. 따라서 해당 문자의 인덱스인 2를 반환해야 합니다. 만약 그러한 문자가 존재하지 않는다면 -1을 반환합니다.문제 해결 접근 방법이 문제는 빈도수 맵(frequency map)을 활용하면 효율적으로 해결할 수 있습니다. 알고리즘의 단계는 다음과 같습니다.빈도수를 저장할 맵(dictionary)을 하나 생성합니다.문자열의
문제 정의배열 A에 n개의 숫자가 있고, 또 다른 입력값 K가 주어진다고 가정해 보겠습니다. 우리는 주어진 연산을 반복 수행한 후 가장 마지막에 0으로 감소하는 인덱스를 찾아야 합니다.연산의 규칙은 다음과 같습니다.A[0]부터 A[N-1]까지 순서대로 각 요소를 A[i] = A[i] - K로 갱신합니다.갱신 결과 A[i] < K가 되면 해당 값을 0으로 설정합니다.한 번 0이 된 요소에는 더 이상 어떤 연산도 수행하지 않습니다.이 연산을 모든 요소가 0이 될 때까지 반복하고, 가장 마지막에 0이 되는 인덱스를 반환하면 됩니다.
이진 트리가 하나 주어졌을 때, 그 안에서 가장 큰 포화(perfect) 이진 하위 트리의 크기를 찾아야 합니다. 포화 이진 트리란 모든 내부 노드가 정확히 두 개의 자식을 가지며, 모든 리프 노드가 동일한 깊이(레벨)에 위치하는 이진 트리를 의미합니다.예를 들어 입력 트리가 다음과 같다고 가정해 보겠습니다.이 경우 출력은 3이며, 찾아진 하위 트리는 다음과 같습니다.해결 접근 방법이 문제는 후위 순회(post-order traversal) 방식의 재귀로 효율적으로 해결할 수 있습니다. 각 단계는 다음과 같습니다.왼쪽·오른쪽 서브트
문제 개요문자열 S가 주어졌을 때, 이 문자열에서 사전 순(lexicographically)으로 가장 큰 회문(palindrome) 부분 수열을 찾는 문제입니다.예를 들어, 입력이 tutorialspointtutorial이라면 출력은 uu가 됩니다.핵심 아이디어이 문제의 핵심은 매우 간단합니다. 단일 문자 자체도 회문에 해당하므로, 문자열에서 가장 큰 문자를 모두 이어 붙인 것이 곧 사전 순으로 가장 큰 회문 부분 수열이 됩니다. 다른 어떤 부분 수열도 최대 문자보다 사전 순으로 앞선 첫 글자를 가질 수 없기 때문입니다.해결 절차는
길이가 n인 숫자 배열 A가 있다고 가정해 보겠습니다. 여기서 각 원소 A[i]는 문자열 s의 길이 (i + 1)짜리 접두사에 포함된 서로 다른 문자의 개수를 의미합니다. 우리의 목표는 이 접두사 배열 조건을 만족하는 문자열 중 사전순으로 가장 작은 문자열을 찾는 것입니다. 사용할 수 있는 문자는 영어 소문자 [a-z]로 제한되며, 조건을 만족하는 문자열이 존재하지 않으면 -1을 반환해야 합니다. 문제 이해하기 예를 들어 입력이 A = [1, 1, 2, 3, 4]라면 출력은 aabcd가 됩니다. prefix[0]에는 서로 다른 문자
주어진 문자열에서 접두사(prefix)이자 접미사(suffix)이면서 동시에 문자열 내부에도 존재하는 가장 긴 부분 문자열(substring)을 찾는 문제입니다. 만약 조건을 만족하는 부분 문자열이 없다면 -1을 반환해야 합니다.예를 들어 입력이 languagepythonlanguageinterestinglanguage라면, 문자열의 시작과 끝에 모두 등장하고 중간에도 포함된 language가 정답이 됩니다.문제 해결 접근: LPS 배열 활용이 문제는 KMP(Knuth–Morris–Pratt) 문자열 검색 알고리즘에서 사용되는 LP
서로 다른 n개의 숫자로 이루어진 배열 A와 양의 정수 K가 주어졌을 때, 최소공배수(LCM)가 K 이하가 되는 가장 긴 부분 수열(sub-sequence)을 찾는 문제를 살펴보겠습니다.조건을 만족하는 부분 수열을 찾았다면 그 LCM 값, 부분 수열의 길이, 그리고 구성 요소들의 인덱스(0부터 시작)를 반환해야 하며, 만족하는 부분 수열이 존재하지 않으면 -1을 반환합니다.예를 들어 입력이 A = [3, 4, 5, 6], K = 20이라고 해봅시다. 이때 출력은 다음과 같습니다.LCM = 12Length = 3Indexes = [0
문제 개요하나의 문자열이 주어졌을 때, 서로 다른 문자를 정확히 k개만 포함하는 가장 긴 부분 문자열(substring)을 구하는 문제입니다. 만약 최대 길이를 가지는 부분 문자열이 여러 개 존재한다면, 그중 아무거나 하나를 반환하면 됩니다.예를 들어 입력이 다음과 같다고 가정해 보겠습니다.s = ppqprqtqtqt, k = 3이 경우 출력은 rqtqtqt가 됩니다. 이 부분 문자열의 길이는 7이며, r, q, t라는 세 종류의 고유한 문자를 정확히 포함하기 때문입니다.접근 방법: 슬라이딩 윈도우(Sliding Window)이 문
문제 개요연료가 가득 찬 상태에서 각각 100km를 주행할 수 있는 바이크가 n대 있다고 가정해 봅시다. 이때 이 n대의 바이크를 활용해 이동할 수 있는 최대 거리를 구하는 것이 목표입니다.여기서 모든 바이크는 동일하며, 1리터의 연료로 1km를 주행할 수 있다고 가정합니다. 만약 n대의 바이크가 같은 지점에서 출발해 나란히 주행한다면, 주행 가능한 거리는 단지 100km에 불과합니다. 따라서 핵심은 최소한의 연료 낭비로 최대 거리를 커버하는 것입니다. 연료 낭비를 줄인다는 것은 곧 실제로 사용하는 바이크 대수를 최소화한다는 의미이
문제 소개 자연수 N(1 ≤ N ≤ 109)이 주어졌을 때, 이 수를 합성수들의 합으로 표현하되 가능한 한 가장 많은 개수의 항으로 분할하는 것이 목표입니다. 답으로 그 최대 개수를 반환하고, 어떤 방법으로도 분할할 수 없다면 -1을 반환해야 합니다. 예를 들어 입력이 16이라면 출력은 4입니다. 16은 4 + 4 + 4 + 4 또는 8 + 8처럼 여러 방식으로 나타낼 수 있지만, 그중 (4 + 4 + 4 + 4)가 가장 많은 항을 사용하는 분할이기 때문입니다. 해결 전략 합성수 중 가장 작은 값은 4이며, 4·6·9 세 가지 수
문제 개요크기가 n인 배열이 있고, 배열의 모든 원소는 0부터 k-1 사이의 값이라고 가정해 보겠습니다. 여기서 k는 양의 정수이며 k ≤ n 조건을 만족합니다. 이때 이 배열에서 가장 많이 반복되는 숫자(최대 반복 숫자)를 찾아야 합니다.예를 들어 입력이 k = 8, A = [3, 4, 4, 6, 4, 5, 2, 8]이라면 숫자 4가 세 번 등장하므로 출력은 4가 됩니다.알고리즘 접근 방식추가 배열이나 해시맵 같은 별도의 자료구조를 사용하지 않고 O(1)의 추가 공간만으로 문제를 해결하려면, 입력 배열 자체를 카운터로 활용하는 기
문제 개요어느 사탕 가게에서 N가지 서로 다른 종류의 사탕을 판매하고 있으며, 각 사탕의 가격이 주어져 있다고 가정해 보겠습니다. 이 가게는 매력적인 프로모션을 진행 중인데, 사탕 하나를 구매하면 다른 종류의 사탕을 최대 K개까지 무료로 받을 수 있습니다.우리의 목표는 두 가지입니다.N가지 사탕을 모두 구매하기 위해 지불해야 하는 최소 금액 구하기N가지 사탕을 모두 구매하기 위해 지불해야 하는 최대 금액 구하기두 경우 모두 프로모션을 최대한 활용하여 무료로 얻을 수 있는 사탕을 최대한 많이 받아야 합니다. 구매 시점에 남아 있는 사
문제 개요두 개의 수 p와 q가 주어졌을 때, 각 수의 무한 배수 표(곱셈표)를 서로 다른 값만큼 밀어낸 뒤, 두 표에 속한 임의의 항들 사이의 최소 차이를 구하는 문제입니다. 이때 시프트 양은 각각 r과 s이며, r과 s는 0 이상의 정수여야 합니다.예시로 이해하기p = 7, q = 17, r = 6, s = 3이라고 가정해 보겠습니다.7의 배수 표: [7, 14, 21, 28, 35, 42, 49, ...]17의 배수 표: [17, 34, 51, 68, 85, 102, 119, ...]여기에 각각 시프트를 적용하면 다음과 같습니
문제 개요크기가 n인 정렬되지 않은 배열 A[0..n-1]이 주어졌다고 가정해 보겠습니다. 우리는 이 배열에서 최소 길이의 연속된 하위 배열 A[s..e]를 찾아야 합니다. 이 하위 배열만 정렬하면 전체 배열이 오름차순으로 정렬됩니다.예를 들어, 배열이 [2,6,4,8,10,9,15]라고 한다면 출력은 5가 됩니다. 정렬해야 하는 하위 배열은 [6,4,8,10,9]입니다. 이 부분만 정렬하면 전체 배열이 [2,4,6,8,9,10,15]로 완전히 정렬되기 때문입니다.해결 접근 방법이 문제는 간단한 비교 방식으로 해결할 수 있습니다.
N × N 크기의 행렬 M이 주어집니다. 이 행렬은 0, 1, 2, 3 네 가지 값으로 채워져 있으며, 출발점(Source)에서 도착점(Destination)까지 빈 칸(Blank cell)을 통해서만 상·하·좌·우로 이동할 때 필요한 최소 이동 횟수를 구해야 합니다. 셀 값의 의미 1: 출발점 (Source) — 단 하나만 존재 2: 도착점 (Destination) — 단 하나만 존재 3: 빈 칸 (Blank cell) — 이동 가능 0: 벽 (Wall) — 이동 불가 이동 한 번당 비용은 1로 계산합니다.
문제 설명 소문자로만 이루어져 있고 길이가 같은 두 문자열 P와 Q가 있다고 가정해 보겠습니다. 우리가 구해야 하는 것은, 아래 나열된 연산들을 적용한 뒤 문자열 P를 Q와 완전히 동일하게 만들기 위해 사전에(전처리 단계에서) 수행해야 하는 최소 이동 횟수입니다. 적용 가능한 연산 임의의 인덱스 i를 선택하여 p[i]와 q[i]를 서로 교환합니다. 임의의 인덱스 i를 선택하여 p[i]와 p[n − i − 1]을 서로 교환합니다. 임의의 인덱스 i를 선택하여 q[i]와 q[n − i − 1]을 서로 교환합니다. 참고: 인덱스 i의