문제 소개 2차원 평면 위에 놓인 두 개의 직사각형(변이 축에 평행한 사각형)이 덮고 있는 총 면적을 구하는 문제입니다. 각 직사각형은 아래 그림과 같이 왼쪽 아래 꼭짓점과 오른쪽 위 꼭짓점의 좌표로 정의됩니다. 첫 번째 직사각형은 (A, B)~(C, D), 두 번째 직사각형은 (E, F)~(G, H)로 표현합니다. 주의할 점은 두 사각형이 겹치는 영역이 있을 경우 그 부분을 한 번만 계산해야 한다는 것입니다. 해결 접근 방법 이 문제의 핵심은 다음과 같습니다. 두 사각형이 겹치지 않는다면 두 면적을 단순히 더하면 됩니다. 겹친
문제 개요정수 배열이 하나 주어졌을 때, n/3번(내림 값)보다 많이 등장하는 모든 원소를 찾아야 합니다. 여기서 n은 배열의 크기를 의미합니다.예를 들어 입력 배열이 [1,1,1,3,3,2,2,2]라고 가정해 보겠습니다. 배열의 크기 n은 8이므로 8/3 = 2, 즉 2번보다 많이 등장하는 원소를 찾으면 됩니다. 이 경우 1은 세 번, 2는 세 번 등장하므로 결과는 [1, 2]가 됩니다.접근 방법: 보이어-무어(Boyer-Moore) 다수결 투표 알고리즘n/3보다 많이 등장하는 원소는 최대 2개까지만 존재할 수 있습니다. 만약 후
숫자와 연산자로 이루어진 문자열이 주어졌을 때, 숫자와 연산자를 다양한 방식으로 묶어서(즉, 괄호를 서로 다르게 배치해서) 얻을 수 있는 모든 가능한 결과값을 찾아야 합니다. 이 문제에서 사용할 수 있는 유효한 연산자는 + , - , * 세 가지입니다.예를 들어 입력이 2*3-4*5라고 한다면, 출력은 [-34, -14, -10, -10, 10]이 됩니다. 그 이유는 다음과 같습니다.(2*(3-(4*5))) = -34((2*3)-(4*5)) = -14((2*(3-4))*5) = -10(2*((3-4)*5)) = -10(((2*3)-
배열이 하나 주어졌을 때, 정확히 두 개의 원소는 한 번만 나타나고 나머지 원소들은 모두 두 번씩 나타난다고 가정해 봅시다. 이때 이 두 숫자를 찾는 함수를 정의해야 합니다. 예를 들어 주어진 배열이 [1,2,3,1,5,2]라면 출력 결과는 [3, 5]가 됩니다.접근 방법이 문제는 XOR(배타적 OR) 비트 연산의 성질을 활용하면 O(n) 시간 복잡도와 O(1) 추가 공간으로 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.모든 원소를 XOR하면 두 번 나타나는 숫자들은 서로 상쇄되고, 결국 한 번만 나타나는 두 숫
못생긴 수(Ugly Number)란 소인수가 오직 2, 3, 5뿐인 양의 정수를 의미합니다. 처음 몇 개의 못생긴 수는 1, 2, 3, 4, 5, 6, 8, 9, 10, 12이며, 이 순서에서 10번째 못생긴 수는 12입니다.이 문제는 n번째 못생긴 수를 효율적으로 찾는 것입니다. 모든 수를 하나씩 검사하는 브루트포스 방식은 매우 비효율적이지만, 다이내믹 프로그래밍(DP)과 세 개의 포인터를 활용하면 O(n) 시간 복잡도로 빠르게 해결할 수 있습니다.알고리즘 핵심 아이디어모든 못생긴 수는 이미 구한 더 작은 못생긴 수에 2, 3,
연구자의 논문 인용 횟수 배열(모두 음이 아닌 정수)이 주어졌을 때, 해당 연구자의 H-지수(H-Index)를 계산하는 함수를 정의하는 문제입니다.H-지수의 정의는 다음과 같습니다. 어떤 과학자의 N편의 논문 중 h편의 논문이 각각 최소 h번 이상 인용되었고, 나머지 N − h편의 논문은 각각 h번 이하로 인용되었다면, 그 과학자의 지수는 h이다.예제 이해하기입력이 citations = [3, 0, 6, 1, 7]이라면 출력은 3입니다. 연구자는 총 5편의 논문을 발표했으며, 각 논문은 3, 0, 6, 1, 7번 인용되었습니다. 최
한 연구자의 논문 인용 횟수 배열(모두 음이 아닌 정수)이 주어졌을 때, 이 배열은 오름차순(비내림차순)으로 정렬되어 있습니다. 우리는 이 연구자의 H-인덱스(h-index)를 계산하는 함수를 작성해야 합니다. H-인덱스의 정의는 다음과 같습니다. 어떤 과학자가 총 N편의 논문 중 h편의 논문이 각각 최소 h번 이상 인용되었고, 나머지 N − h편의 논문은 각각 h번 이하로 인용되었다면, 그 과학자의 인덱스는 h입니다. 예를 들어 입력이 citations = [0, 1, 4, 5, 6]이라면 출력은 3이 됩니다. 연구자가 5편의
문제 개요0부터 9까지의 숫자만으로 구성된 문자열이 주어졌을 때, 이 문자열이 덧셈 숫자(Additive Number)인지 판별하는 함수를 작성해야 합니다. 덧셈 숫자란 문자열의 자릿수들이 하나의 덧셈 수열을 이룰 수 있는 문자열을 의미합니다.유효한 덧셈 수열은 최소 세 개의 숫자를 포함해야 하며, 첫 두 숫자를 제외한 나머지 모든 숫자는 바로 앞에 있는 두 숫자의 합과 같아야 합니다. 예를 들어 입력이 112358이라면 결과는 true입니다. 1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8처럼 수열이
문제 개요문자열 배열 words가 주어졌을 때, 서로 공통된 문자를 갖지 않는 두 단어 word[i]와 word[j]에 대해 length(word[i]) × length(word[j]) 값의 최댓값을 구하는 것이 목표입니다. 모든 단어는 영어 소문자로만 이루어져 있다고 가정하며, 조건을 만족하는 두 단어가 존재하지 않으면 0을 반환합니다.예를 들어 입력이 [abcw, baz, foo, bar, xtfn, abcdef]라면 출력은 16입니다. 그 이유는 abcw와 xtfn이 공통 문자를 하나도 공유하지 않으면서 각각 길이가 4이므로,
출발 공항과 도착 공항의 쌍 [from, to] 형태로 표현된 항공권 목록이 주어졌다고 가정해 봅시다. 우리는 이 항공권들을 모두 사용해 여정을 올바른 순서대로 재구성해야 합니다. 모든 항공권은 JFK에서 출발하는 한 사람의 소유이므로, 완성된 여정은 반드시 JFK에서 시작해야 합니다.예를 들어 입력이 [[MUC, LHR], [JFK, MUC], [SFO, SJC], [LHR, SFO]]라면, 출력은 [JFK, MUC, LHR, SFO, SJC]가 됩니다.문제 해결 접근 방법이 문제는 본질적으로 오일러 경로(Eulerian Path
문제 소개양의 정수 n이 주어졌을 때, 이를 최소 두 개 이상의 양의 정수의 합으로 분할하고, 그 수들의 곱이 최대가 되도록 만드는 문제입니다.예를 들어 n = 10이라면, 10 = 3 + 3 + 4로 나눌 때 곱이 3 × 3 × 4 = 36으로 가장 크므로 정답은 36이 됩니다.접근 방법 (동적 계획법)이 문제는 메모이제이션(memoization)을 활용한 동적 계획법(DP)으로 효율적으로 해결할 수 있습니다. 해결 과정은 다음과 같습니다.solve(n, dp, flag) 메서드를 정의합니다.n이 0이면 1을 반환합니다. (분할이
음이 아닌 정수 n이 주어졌을 때, 0부터 10^n 범위 안에서 모든 자릿수가 서로 다른(중복되지 않는) 숫자 x의 개수를 구하는 문제입니다.예를 들어 n이 2라면, 구해야 할 범위는 0부터 100까지입니다. 이때 11, 22, 33, 44, 55, 66, 77, 88, 99처럼 같은 숫자가 반복되는 수는 제외해야 하므로, 결과값은 91이 됩니다.문제 해결 접근 방법이 문제는 수학적 규칙을 활용하면 효율적으로 풀 수 있습니다. 각 단계는 다음과 같습니다.n이 0이면, 표현할 수 있는 숫자는 0 하나뿐이므로 1을 반환합니다.n의 값이
문제 소개용량이 각각 x리터와 y리터인 두 개의 물통이 있다고 가정해 보겠습니다. 우리는 무한한 양의 물을 사용할 수 있으며, 이 두 물통만으로 정확히 z리터의 물을 측정할 수 있는지 판단해야 합니다.측정이 가능하려면, 작업이 끝난 시점에 한쪽 또는 양쪽 물통에 담긴 물의 총량이 정확히 z리터가 되어야 합니다.허용되는 연산이 문제에서 수행할 수 있는 연산은 다음 세 가지뿐입니다.아무 물통이든 가득 찰 때까지 물을 채운다.아무 물통이든 완전히 비운다.한 물통에서 다른 물통으로 물을 붓는데, 받는 쪽 물통이 가득 차거나 붓는 쪽 물통이
서로 다른 양의 정수로 이루어진 집합이 주어졌을 때, 해당 집합 내 모든 원소 쌍 (Si, Sj)이 Si % Sj == 0 또는 Sj % Si == 0 조건을 만족하도록 하는 가장 큰 부분 집합을 찾는 문제입니다.예를 들어 입력이 [1, 2, 3]이라면 가능한 답은 [1, 2] 또는 [1, 3]이 될 수 있습니다. 2와 3은 서로 나누어 떨어지지 않으므로 두 숫자를 동시에 포함할 수 없기 때문입니다.문제 해결 접근 방식이 문제는 최장 증가 부분 수열(LIS) 알고리즘과 유사한 방식으로 동적 계획법(DP)을 적용해 해결할 수 있습니다
문제 개요양의 정수 a와 매우 큰 양의 정수 b가 배열 형태로 주어졌을 때, a^b mod 1337의 값을 계산하는 것이 목표입니다. 예를 들어 a = 2이고 b = [1,0](즉, 숫자 10)이라면 결과는 1024입니다.b가 일반적인 정수 자료형의 범위를 훨씬 넘어설 수 있기 때문에, 지수를 한 번에 다루는 대신 자릿수 단위로 분할하여 처리하는 전략이 필요합니다.풀이 접근 방법핵심 아이디어는 두 가지입니다.빠른 거듭제곱(모듈러 지수 연산): 반복 곱셈 대신 제곱으로 분할하여 O(log n) 시간 안에 거듭제곱을 계산합니다.재귀적
흔들리는 수열(Wiggle Sequence)이란?연속된 숫자 사이의 차이가 양수와 음수를 엄격하게 번갈아 나타내는 수열을 흔들리는 수열(Wiggle Sequence)이라고 합니다. 이때 첫 번째 차이는 양수 또는 음수 어느 쪽이든 상관없습니다. 또한 원소가 두 개 미만인 수열은 자명하게 흔들리는 수열로 간주됩니다.예를 들어 [1,7,4,9,2,5]는 인접한 숫자 간의 차이가 (6,-3,5,-7,3)으로 양수와 음수가 번갈아 나타나므로 흔들리는 수열입니다. 반면 [1,4,7,2,5]는 처음 두 차이가 모두 양수이고, [1,7,4,5,
문제 개요 단일 연결 리스트(singly linked list)가 주어졌을 때, 리스트 안에서 임의의 노드 하나의 값을 반환하는 문제입니다. 여기서 중요한 조건은 모든 노드가 동일한 확률로 선택되어야 한다는 점입니다. 예를 들어 리스트가 [1, 2, 3]이라면 반환되는 값은 반드시 1, 2, 3 중 하나여야 하며, 각 값이 선택될 확률은 정확히 1/3이 되어야 합니다. 접근 방법: 저수지 샘플링(Reservoir Sampling) 리스트의 전체 길이를 미리 알 수 없거나 한 번의 순회만 허용되는 상황에서 균등한 확률을 보장하려면
문제 설명1부터 n까지의 정수가 오름차순으로 정렬된 리스트가 있다고 가정해 봅시다. 이 게임의 규칙은 다음과 같습니다.먼저 왼쪽에서 오른쪽으로 진행하며, 첫 번째 숫자부터 시작해 하나 걸러 하나씩 숫자를 제거합니다. 즉, 리스트 끝에 도달할 때까지 첫 번째, 세 번째, 다섯 번째… 숫자를 차례로 지웁니다.그다음에는 오른쪽에서 왼쪽으로 방향을 바꿔, 남은 숫자들 중 맨 오른쪽 숫자부터 하나 걸러 하나씩 다시 제거합니다.이 과정을 방향을 계속 번갈아 가며 반복하여, 마지막에 단 하나의 숫자만 남을 때까지 진행합니다.길이가 n인 리스트로
UTF-8 유효성 검사 문제란?정수 리스트가 주어졌을 때, 해당 데이터가 유효한 UTF-8 인코딩인지 판별하는 문제입니다. 하나의 UTF-8 문자는 1바이트에서 4바이트 길이까지 가질 수 있으며, 각 문자는 다음과 같은 규칙을 따릅니다.1바이트 문자: 첫 번째 비트는 0이며, 나머지 비트에 유니코드 코드 포인트가 저장됩니다.n바이트 문자(n ≥ 2): 첫 n개 비트는 모두 1이고, n+1번째 비트는 0입니다. 이어지는 n-1개의 바이트는 모두 최상위 2비트가 10으로 시작해야 합니다.UTF-8 인코딩 규칙 정리유니코드 문자의 값 범
문제 개요 정수 배열 A와 그 길이 n이 주어진 상황을 가정해 보겠습니다. 배열 A를 시계 방향으로 k칸 회전한 결과를 배열 B(k)라고 할 때, 회전 함수는 다음과 같이 정의됩니다. F(k) = 0 × B(k)[0] + 1 × B(k)[1] + ... + (n-1) × B(k)[n-1] 목표는 F(0)부터 F(n-1)까지 모든 값 중에서 최댓값을 찾는 것입니다. 예제로 살펴보기 입력이 A = [4, 3, 2, 6]인 경우, 각 회전 단계별로 함수 값을 계산하면 다음과 같습니다. F(0) = (0×4) + (1×3) + (2×2