문제 소개물통 1000개가 있다고 가정해 봅시다. 그중 정확히 하나에는 독이 들어 있고, 나머지는 모두 깨끗한 물이 담겨 있습니다. 물통들은 겉보기에 완전히 똑같아서 눈으로 구별할 수 없습니다.흥미로운 조건이 하나 있습니다. 돼지가 독이 든 물을 마시면 15분 안에 반드시 죽는다는 것입니다. 그렇다면 한 시간(60분) 안에 독이 든 물통을 찾아내려면 최소 몇 마리의 돼지가 필요할까요?일반화된 문제 정의이 문제를 일반화하면 다음과 같습니다.서로 다른 물통이 n개 있다.돼지가 독을 마시면 m분 안에 죽는다.p분 안에 독이 든 물통을 찾
문제 개요 중복 없는 서로 다른 단어들의 목록이 주어져 있습니다. 우리가 설계해야 할 알고리즘은 이 목록 속에서 연결된 단어(concatenated word)를 모두 찾아내는 것입니다. 여기서 연결된 단어란 주어진 배열에 포함된 두 개 이상의 더 짧은 단어만으로 완전히 구성된 문자열을 의미합니다. 예를 들어 단어 목록이 [cow, cows, cowsgoatcows, goat, goatcowsgoat, hippopotamuses, deer, deercowgoatcow]라고 가정하면, 출력 결과는 [cowsgoatcows, goatco
문제 설명 정수 n이 입력으로 주어졌을 때, 두 개의 n자리 수를 서로 곱하여 만들 수 있는 가장 큰 회문(팰린드롬)을 찾아야 합니다. 곱셈 결과가 지나치게 커질 수 있기 때문에, 최종 답은 1337로 나눈 나머지(mod 1337)를 반환합니다. 예를 들어 입력이 2라면 정답은 987입니다. 두 자리 수끼리의 곱 중 가장 큰 회문은 99 × 91 = 9009이며, 9009 mod 1337 = 987이기 때문입니다. 접근 방식 이 문제의 핵심 아이디어는 회문의 앞쪽 절반이 정해지면 뒤쪽 절반은 자동으로 결정된다는 점입니다. 따라서
숫자 리스트와 윈도우 크기 k가 주어졌을 때, 슬라이딩 윈도우 방식으로 각 위치의 중앙값(median) 목록을 구하는 문제입니다. 예를 들어 다음과 같은 배열이 있다고 가정해 보겠습니다.윈도우 위치중앙값13-1-35368113-1-35368-113-1-35368-113-1-35368313-1-35368513-1-353686위 표에서 주황색으로 표시된 부분이 현재 윈도우에 포함된 요소들입니다. 여기서 k는 3이며, 최종 결과는 [1, -1, -1, 3, 5, 6]이 됩니다. 즉, 윈도우가 한 칸씩 오른쪽으로 이동할 때마다 해당 구간의
주마 게임 문제란?주마 게임(Zuma Game)은 테이블 위에 일렬로 늘어선 공들을 처리하는 흥미로운 알고리즘 문제입니다. 공은 빨강(R), 노랑(Y), 파랑(B), 초록(G), 흰색(W) 다섯 가지 색으로 구성되며, 플레이어 역시 몇 개의 공을 손에 들고 시작합니다.게임 규칙은 다음과 같습니다. 매 턴마다 손에 든 공 하나를 골라 기존 줄의 원하는 위치에 삽입합니다. 삽입 후 같은 색의 공이 3개 이상 연속으로 붙어 있다면 해당 그룹 전체가 제거됩니다. 이 과정은 더 이상 제거할 수 있는 그룹이 없을 때까지 반복됩니다.목표는 테이
배열이 하나 주어졌다고 가정해 봅시다. 이 배열에서 두 원소 A[i]와 A[j]가 아래 조건을 만족할 때, 이 쌍을 중요 역순 쌍(important reverse pair)이라고 부릅니다.i < j 이고 A[i] > 2 × A[j]우리가 구해야 할 것은 바로 이러한 중요 역순 쌍의 개수입니다. 예를 들어 입력이 [2, 8, 7, 7, 2]라면 결과는 3이 됩니다.실제로 조건을 만족하는 쌍은 (8, 2), (7, 2), (7, 2)로 세 가지입니다. 여기서 8은 뒤에 있는 2보다 두 배 이상 크고, 두 개의 7 역시 마찬가
문제 상황한 회사 A가 곧 IPO(기업공개)를 진행하려 한다고 가정해 봅시다. 주식을 좋은 가격에 판매하기 위해 A는 IPO 전에 여러 프로젝트를 수행해 자본을 늘리고 싶어 합니다. 하지만 A의 자원은 제한적이어서, 최대 k개의 서로 다른 프로젝트만 완료할 수 있습니다. 과연 최대 k개의 프로젝트를 마친 뒤 총 자본을 최대화하려면 어떤 프로젝트를 어떤 순서로 선택해야 할까요?문제 정의여러 개의 프로젝트가 주어집니다. 각 프로젝트 i마다 순수익 Pi가 있으며, 해당 프로젝트를 시작하려면 최소 자본 Ci가 필요합니다. 처음에 우리가 가
문제 소개n대의 슈퍼 세탁기가 한 줄로 나열되어 있다고 가정해 봅시다. 처음 상태에서 각 세탁기에는 옷이 몇 벌씩 들어 있거나 비어 있을 수 있습니다. 매 이동(move)마다 임의의 m개(1 ≤ m ≤ n)의 세탁기를 선택할 수 있으며, 선택된 각 세탁기는 자신이 가진 옷 한 벌을 인접한 세탁기 중 하나로 동시에 전달합니다.왼쪽부터 오른쪽까지 각 세탁기에 들어 있는 옷의 개수를 담은 정수 배열이 주어질 때, 모든 세탁기의 옷 개수를 동일하게 만들기 위해 필요한 최소 이동 횟수를 구하는 것이 목표입니다. 만약 균등하게 분배하는 것이
문제 이해하기여러 개의 상자가 일렬로 나열되어 있고, 각 상자는 서로 다른 색상을 가지고 있다고 가정해 보겠습니다. 색상은 서로 다른 양의 정수로 표현됩니다. 우리는 모든 상자가 사라질 때까지 여러 라운드에 걸쳐 상자를 제거할 수 있으며, 각 라운드마다 같은 색상으로 연속된 k개의 상자(k ≥ 1)를 선택해 한 번에 제거하고 그 대가로 k × k점을 얻습니다.예를 들어 입력이 [1, 3, 2, 2, 2, 4, 4, 3, 1]이라면 출력은 21이 됩니다. 목표는 상자를 제거하는 순서를 잘 선택해서 얻을 수 있는 최대 점수를 구하는 것
문제 개요 양의 정수 n이 주어졌을 때, 길이가 n인 모든 가능한 출석 기록 중 보상 가능(rewardable)한 기록의 개수를 구하는 것이 이번 문제의 목표입니다. 답이 매우 커질 수 있기 때문에 결과는 10^9 + 7로 나눈 나머지를 반환해야 합니다. 학생 출석 기록 문자열에는 아래 세 가지 문자만 사용할 수 있습니다. A : 결석(Absent) L : 지각(Late) P : 출석(Present) 출석 기록이 보상 가능하려면 다음 두 조건을 모두 충족해야 합니다. 결석(A)이 최대 1개 이하여야 합니다. 연속된 지각(L)이
문제 개요 숫자 n이 주어졌을 때, n과의 절대 차이가 가장 작은 회문(팰린드롬)을 찾는 것이 목표입니다. 회문이란 앞에서 읽으나 뒤에서 읽으나 같은 수를 의미하며, 정답은 n보다 작을 수도 있고 클 수도 있습니다. 예를 들어 n이 145라면 가장 가까운 회문은 141입니다. 접근 방식: 절반 미러링 모든 숫자를 하나씩 확인하는 대신, n의 왼쪽 절반을 기준으로 오른쪽 절반을 거울처럼 뒤집어 붙이면 회문을 만들 수 있다는 점에 착안합니다. 왼쪽 절반을 그대로 사용하는 경우, 1을 뺀 경우, 1을 더한 경우 세 가지만 시도하면 충분
양의 정수 n이 주어졌을 때, n 이하의 음이 아닌 정수 중에서 2진수 표현에 연속된 1이 포함되지 않는 수의 개수를 구하는 문제입니다. 예를 들어 입력이 7이라면 정답은 5가 됩니다. 5의 2진수 표현은 101로, 연속된 1이 나타나지 않기 때문입니다.문제 접근 방법이 문제는 다음 단계를 따라 해결할 수 있습니다.정수 n을 받아 2진수 문자열로 변환하는 convert() 함수를 정의합니다.ret := 빈 문자열로 초기화합니다.n이 0이 아닌 동안 다음을 반복합니다.ret에 (n mod 2)를 추가합니다.n을 오른쪽으로 1비트 시프
두 정수 n과 k가 주어졌을 때, 1부터 n까지의 숫자로 구성된 배열 중에서 정확히 k개의 역쌍(inverse pair)을 가지는 서로 다른 배열의 개수를 구하는 문제입니다.여기서 역쌍이란 배열 내 i번째 원소와 j번째 원소에 대해 i < j이면서 a[i] > a[j]인 경우를 의미합니다. 즉, 앞에 있는 숫자가 뒤에 있는 숫자보다 큰 경우가 역쌍이 됩니다.정답은 매우 커질 수 있으므로, 결과는 $10^{9}$ + 7로 나눈 나머지를 출력해야 합니다.예제 이해하기예를 들어 입력이 n = 3, k = 1이라면 출력은 2가
이번 글에서는 K개의 정렬된 정수 리스트가 주어졌을 때, 각 리스트에서 최소 하나 이상의 숫자를 포함하는 가장 작은 범위(smallest range)를 찾는 방법을 다룹니다.여기서 두 범위를 비교할 때, 범위 [a, b]가 범위 [c, d]보다 작다는 것은 b - a < d - c 이거나, 크기가 같을 경우(b - a == d - c) a < c 인 경우를 의미합니다.문제 예시입력이 다음과 같다고 가정해 보겠습니다.[[4,10,15,25,26], [0,9,14,20], [5,18,24,30]]이 경우 출력은 [14, 18
문제 개요A부터 Z까지의 알파벳으로 이루어진 메시지가 다음과 같은 규칙으로 숫자에 매핑되어 인코딩되었다고 가정해 보겠습니다.A → 1, B → 2, ... , Z → 26여기서 중요한 점은 인코딩된 문자열에 특수 문자 *(와일드카드)가 포함될 수 있다는 것입니다. 이 문자는 1부터 9까지의 어떤 숫자로든 해석될 수 있습니다. 따라서 숫자와 *가 섞여 있는 인코딩된 메시지가 주어졌을 때, 이를 디코딩할 수 있는 총 경우의 수를 구해야 합니다.결괏값이 매우 커질 수 있으므로, 최종 답은 10⁹ + 7(1,000,000,007)로 나눈
문제 소개 동작 방식이 조금 특이한 이상한 프린터(Strange Printer)가 있다고 가정해 봅시다. 이 프린터에는 다음과 같은 제약 조건이 있습니다. 프린터는 한 번에 같은 문자로만 이루어진 연속된 문자열을 출력할 수 있습니다. 각 차례마다 임의의 시작 위치와 끝 위치를 골라 새 문자를 출력할 수 있으며, 해당 범위에 이미 출력되어 있던 문자는 모두 덮어쓰기 됩니다. 소문자 알파벳으로만 구성된 문자열이 주어졌을 때, 이 문자열 전체를 완성하기 위해 필요한 최소 출력 횟수를 구하는 것이 우리의 목표입니다. 예를 들어 입력이
문제 소개곱셈표(Multiplication Table)를 떠올려 본 적이 있을 것입니다. 그렇다면 이 곱셈표 안에서 k번째로 작은 수를 빠르게 찾아낼 수 있을까요? 문제는 다음과 같습니다. 세로 길이가 m이고 가로 길이가 n인 m × n 크기의 곱셈표와 양의 정수 k가 주어졌을 때, 표에 있는 수들 중 k번째로 작은 값을 구하는 것입니다.예시m = 3, n = 3이고 k = 6이라고 가정해 보겠습니다. 이때 출력 결과는 4가 됩니다. 곱셈표는 다음과 같이 만들어지기 때문입니다.123112322463369표의 모든 원소를 오름차순으로
문제 개요 네 장의 카드가 있고, 각 카드에는 1부터 9 사이의 숫자가 적혀 있다고 가정해 보겠습니다. 목표는 이 숫자들에 +, -, *, / 연산자를 적절히 조합해 최종 결과가 정확히 24가 되는지 판별하는 것입니다. 예를 들어 [4, 9, 2, 6]이 주어졌다면 다음과 같이 계산할 수 있습니다. (4 × 9) − (2 × 6) = 36 − 12 = 24 따라서 이 경우 정답은 true입니다. 접근 방법: 재귀와 백트래킹 이 문제는 가능한 모든 조합을 시도하는 완전 탐색 방식으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습
```html 문제 설명루트가 있는 트리(rooted tree)란 방향 그래프의 한 종류로, 다른 모든 노드가 이 노드의 자손이 되는 단 하나의 노드(루트)가 존재하고, 루트를 제외한 모든 노드는 정확히 하나의 부모를 가지며, 루트 자신은 부모가 없는 그래프를 의미합니다.입력으로 주어지는 그래프는 N개의 노드(모든 값은 고유함)로 구성된 루트 트리에서 시작해 하나의 추가 방향 간선이 덧붙여진 형태입니다. 추가된 간선은 1부터 N 사이의 서로 다른 두 정점을 선택하며, 기존에 존재하지 않던 새로운 간선입니다.그래프는 간선 목록을 담은
문제 소개 양의 정수로 이루어진 배열 nums가 주어졌을 때, 합이 최대가 되는 세 개의 서로 겹치지 않는(non-overlapping) 부분 배열을 찾아야 합니다. 각 부분 배열의 길이는 k로 고정되어 있으며, 세 부분 배열에 속한 모든 원소(총 3×k개)의 합을 최대화하는 것이 목표입니다. 결과는 각 구간의 시작 인덱스를 담은 리스트 형태로 반환합니다. 만약 조건을 만족하는 답이 여러 개라면, 그중 사전순으로 가장 작은(lexicographically smallest) 하나를 선택해야 합니다. 예시로 이해하기 입력 배열이 [1,