주어진 레이블에 해당하는 오른쪽(right) 슬라이스 경계를 계산하려면 index.get_slice_bound() 메서드를 사용합니다. 이때 side 매개변수를 right로 설정해야 합니다. 메서드 개요 get_slice_bound()는 슬라이싱 작업 시 특정 레이블이 어느 위치의 경계에 해당하는지 정수 위치값으로 반환해 주는 메서드입니다. 주요 매개변수는 다음과 같습니다. label: 경계를 찾고자 하는 레이블 값 side: left 또는 right 중 선택하며, 왼쪽 또는 오른쪽 경계를 결정합니다. kind: getitem 또
주어진 레이블에 해당하는 왼쪽 슬라이스 경계(left slice bound)를 계산하려면 index.get_slice_bound() 메서드를 사용합니다. 이때 side 매개변수를 left로 설정하면 해당 레이블의 왼쪽 슬라이스 경계 위치가 반환됩니다.이 메서드는 슬라이싱 작업 시 특정 레이블이 인덱스에서 어느 위치에 해당하는지 정수형 위치값으로 알려주기 때문에, 레이블 기반 슬라이싱(label-based slicing)의 내부 동작을 이해하거나 직접 구현할 때 유용하게 활용됩니다.1단계: 라이브러리 가져오기먼저 필요한 라이브러리를
정수 리스트로 구성할 수 있고, 필요할 때마다 인덱스 i부터 j-1까지의 요소 합을 효율적으로 구하는 기능을 제공하는 데이터 구조를 개발한다고 가정해 봅시다. 이 데이터 구조는 두 가지 기능을 가져야 합니다.생성자(Constructor): 정수 배열을 받아 새로운 인스턴스를 생성합니다.get_sum(i, j): 시작 인덱스 i부터 끝 인덱스 j-1까지의 배열 요소 합을 반환합니다.예를 들어, 입력이 array = [5,2,3,6,4,7,8,9,3,2]라고 하고 obj 객체를 생성한 후 obj.get_sum(1,5)와 obj.get_
만료 시간(expire time)을 가지며, 사용자 ID와 타임스탬프를 인자로 받아 해당 시점의 요청이 실패하는지 여부를 판단하는 함수를 지원하는 데이터 구조를 개발한다고 가정해 봅시다. 요청은 오직 해당 사용자가 만료 시간 이내에 성공적인 요청을 보낸 기록이 있을 때만 실패하게 됩니다.동작 예시예를 들어 expire = 6으로 객체 obj를 생성한 뒤, 다음 순서대로 함수를 호출한다고 해봅시다.obj.limit(0, 10) → False: 사용자 0의 첫 요청이므로 기록이 없어 통과됩니다.obj.limit(0, 16) → Fals
문제 설명이진 문자열 s가 주어졌다고 가정해 봅시다. 수행할 수 있는 연산은 비트 하나를 선택해 그 값을 뒤집는 것(0을 1로, 또는 1을 0으로)입니다. 목표는 세 개의 동일한 비트가 연속으로 등장하지 않는 문자열을 만드는 것이며, 이때 필요한 최소 연산 횟수를 구해야 합니다.예를 들어 입력이 s = "10011100"이라면 출력은 1입니다. 인덱스 4의 비트 1을 0으로 뒤집어 "10010100"을 만들면 더 이상 세 개의 연속된 동일 비트가 존재하지 않기 때문입니다.접근 방법이 문제를 해결하
두 개의 영문 문자열 s와 t가 주어졌다고 가정해 봅시다. 문자열에는 소문자와 대문자가 섞여 있을 수 있습니다. 이 문제의 목표는 한 문자열이 다른 문자열을 회전(rotation)시킨 결과인지 판별하는 것입니다. 예를 들어, 입력이 s = "koLKAta", t = "KAtakoL"이라면 출력 결과는 True가 됩니다. 해결 접근 방법 이 문제는 다음 단계를 거쳐 해결할 수 있습니다. 먼저 s와 t의 길이를 비교합니다. 길이가 다르면 회전 관계일 수 없으므로 False를 반환합니다. s를 자기
런-길이 인코딩(Run-Length Encoding)된 소문자 문자열 s로 생성되는 반복자(iterator) 클래스를 정의한다고 가정해 보겠습니다. 이 반복자 클래스에는 두 가지 핵심 함수가 필요합니다. next(): 반복자의 다음 요소를 찾아 반환합니다. hasnext(): 다음 요소가 존재하는지 여부를 확인합니다. 예를 들어 입력이 s = 2b1a라고 할 때, 이 문자열로 객체를 생성한 후 next(), hasnext(), next(), next(), hasnext() 순서로 호출하면 출력은 b, True, b, a, Fal
문제 이해하기숫자 n이 주어지고, n명의 사람이 각각 앉을 자리를 찾고 있다고 가정해 봅시다. 또한 0과 1로 이루어진 좌석 리스트가 있는데, 여기서 1은 이미 사용 중인 좌석, 0은 비어 있는 좌석을 의미합니다.단, 두 사람이 서로 바로 옆자리에 앉는 것은 허용되지 않습니다. 따라서 우리가 확인해야 할 것은 n명의 사람이 모두 이 조건을 만족하는 자리를 찾을 수 있는지 여부입니다.예를 들어, n = 2이고 seats = [1, 0, 0, 0, 1, 0, 0]이라면 결과는 True입니다. 두 사람은 각각 인덱스 2와 인덱스 6에 서
이번 글에서는 Python의 내장 set 클래스를 사용하지 않고, 다음과 같은 메서드를 가진 집합(Set) 데이터 구조를 직접 구현해 보겠습니다.생성자(Constructor) : 집합의 새 인스턴스를 생성합니다.add(val) : 정수 val을 집합에 삽입합니다.exists(val) : val이 집합에 존재하는지 확인합니다.remove(val) : val을 집합에서 삭제합니다.동작 예시집합 s를 생성한 후 s.add(10), s.add(20), s.add(10), s.exists(10), s.remove(10), s.exists(1
숫자 리스트 nums가 주어졌을 때, 이 리스트를 오른쪽으로 원하는 횟수만큼 회전시켜 [1, 2, ..., n] 또는 [n, n-1, ..., 1]처럼 첫 n개의 자연수가 증가하거나 감소하는 형태로 만들 수 있는지 확인해야 합니다.예를 들어 입력이 nums = [5, 6, 1, 2, 3, 4]라면 결과는 True입니다. 리스트를 네 번 오른쪽으로 회전하면 [1, 2, 3, 4, 5, 6]이 되기 때문입니다.해결 접근 방법이 문제는 인접한 두 요소 사이의 차이를 검사하는 방식으로 해결할 수 있습니다. 올바르게 회전된 연속 자연수 배열
문제 개요숫자로 이루어진 리스트 nums가 주어졌다고 가정해 보겠습니다. 이 리스트에서 가장 자주 등장하는 숫자의 빈도를 k라고 할 때, 우리가 구해야 하는 것은 부분 리스트(sublist) 안에서 가장 빈번한 요소의 빈도 역시 k가 되는 가장 짧은 부분 리스트의 길이입니다.문제 예시예를 들어 입력이 nums = [10, 20, 30, 40, 30, 10]이라면 결과는 3이 됩니다. 이 리스트에서 가장 많이 등장하는 숫자는 10과 30이며, 각각 두 번씩 나타나므로 k = 2입니다. 여기서 [30, 40, 30]이라는 부분 리스트를
문자열 s가 1, 2, 3, ? 네 가지 문자로만 구성되어 있다고 가정해 봅시다. ? 자리에는 1, 2, 3 중 어떤 숫자든 자유롭게 채워 넣을 수 있습니다. 우리가 찾아야 하는 것은 인접한 두 자릿수가 절대 같지 않도록 ?를 채웠을 때 만들 수 있는 가장 작은 수입니다.예를 들어 입력이 s = 2??3?라면, 출력은 21231이 됩니다.문제 해결 접근 방식이 문제는 왼쪽부터 차례대로 탐색하면서(greedy 방식) 각 ? 자리에 가능한 한 작은 숫자를 배치하는 방법으로 해결할 수 있습니다. 각 위치에서 왼쪽과 오른쪽 이웃 숫자를 확
숫자 리스트가 주어졌을 때, 인덱스 i와 j(단, i < j이고 j - i > 1)를 만족하는 모든 쌍 중에서 합이 가장 작은 값을 구하는 문제를 살펴보겠습니다. 여기서 j - i > 1 조건은 서로 인접한 두 요소는 선택할 수 없다는 의미입니다.예를 들어 입력이 nums = [3, 4, 2, 2, 4]라면 출력은 5가 됩니다. 값 3과 2를 선택하면 합이 5이기 때문입니다. 반면 마지막에 있는 2와 2는 서로 인접해 있어서 j - i > 1 제약 조건을 위반하므로 선택할 수 없습니다.문제 해결 접근 방법이 문
숫자로 이루어진 리스트 nums가 있다고 가정해 보겠습니다. 각 숫자를 이진수로 표현했을 때 나타나는 1의 개수를 기준으로 이 리스트를 오름차순으로 정렬해야 합니다. 만약 두 숫자의 1의 개수가 서로 같다면, 값 자체를 기준으로 정렬합니다.예를 들어 입력이 nums = [4, 1, 12, 7, 6]이라면 출력은 [1, 4, 6, 12, 7]이 됩니다. 그 이유는 다음과 같습니다.4의 이진수 표현: 01001의 이진수 표현: 00016의 이진수 표현: 011012의 이진수 표현: 11007의 이진수 표현: 0111따라서 최종 정렬 결
문제 개요오름차순으로 정렬된 숫자 리스트 nums가 주어졌을 때, 각 요소를 제곱한 후 그 결과를 다시 정렬된 순서로 반환하는 것이 이번 문제의 목표입니다.예를 들어 입력이 nums = [-8, -3, 0, 5, 6]이라면, 각 요소를 제곱한 값은 [64, 9, 0, 25, 36]이 되고, 이를 정렬하면 최종 출력은 [0, 9, 25, 36, 64]가 됩니다.접근 방법: 투 포인터(Two Pointer) 기법모든 요소를 제곱한 뒤 다시 정렬하면 O(n log n)의 시간이 필요하지만, 입력 리스트가 이미 정렬되어 있다는 특성을 활용
문제 개요숫자로 이루어진 리스트 nums가 주어졌다고 가정해 보겠습니다. 이때 이 리스트가 엄격히 증가 → 엄격히 감소 → 엄격히 증가하는 식으로 증가와 감소를 번갈아 가며 변화하는지 확인해야 합니다. 단, 리스트 전체가 엄격히 증가만 하는 경우에도 유효한 것으로 간주합니다.예시입력이 nums = [2, 4, 8, 7, 5, 1, 5, 7, 2, 1]이라면 결과는 True입니다. 그 이유는 다음과 같습니다.[2, 4, 8] → 증가[7, 5, 1] → 감소[5, 7] → 증가[2, 1] → 감소증가 구간과 감소 구간이 교대로 나타나
두 개의 문자열 s와 t가 있다고 가정해 봅시다. 우리는 t를 만들고 싶지만, 키보드에 일부 키가 눌린 상태로 고착되어 있어서 특정 문자가 한 번 이상 반복해서 입력될 수 있는 상황입니다. 이때 실제로 입력된 문자열 s가 원래 의도했던 문자열 t를 작성하려던 것일 수 있는지 확인해야 합니다.예를 들어, 입력이 s = appppleee, t = apple이라면 출력 결과는 True가 됩니다. p와 e가 여러 번 반복되었더라도 멈춘 키 때문에 발생한 것으로 볼 수 있기 때문입니다.해결 접근 방법이 문제를 해결하기 위해 다음 단계를 따릅
문제 개요숫자 n이 주어졌을 때, 처음 n개의 양의 홀수 정수의 합을 구하는 프로그램을 작성해야 합니다.예를 들어 입력이 n = 10이라면 출력은 100이 됩니다. 처음 10개의 홀수는 [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]이며, 이들의 합은 100입니다.핵심 아이디어: 수학적 성질 활용이 문제는 반복문 없이도 매우 간단하게 해결할 수 있습니다. 열쇠가 되는 것은 다음과 같은 수학적 성질입니다.처음 n개의 홀수(1, 3, 5, ..., 2n−1)의 합은 항상 n의 제곱(n²)과 같습니다.실제로 1 = 1²,
문제 개요 다음 두 가지 메서드를 갖춘 자료구조를 설계한다고 가정해 보겠습니다. add(val) — 값 val을 자료구조에 추가합니다. find(val) — 합이 val이 되는 두 원소가 존재하는지 확인합니다. 핵심 요구 사항은 쿼리가 들어올 때마다 매번 전체 데이터를 검색하지 않고도 즉시 결과를 얻을 수 있도록 설계하는 것입니다. 예를 들어 객체 obj를 생성한 뒤 6, 14, 3, 8, 11, 15를 차례로 추가하고, 이어서 obj.find(9), obj.find(11), obj.find(15)를 호출하면 출력은 True,
숫자 리스트 nums와 목표 값(target)이 주어졌을 때, 두 수의 합이 목표 값보다 작은(즉, target-1 이하인) 쌍 중에서 가장 큰 합을 구하는 문제입니다.예를 들어, nums = [8, 3, 4, 9, 2]이고 target = 8이라면 출력 결과는 7이 됩니다. 8 미만의 두 수 조합 중 가장 큰 합은 4 + 3 = 7이기 때문입니다.문제 해결 접근 방법이 문제는 정렬과 투 포인터(Two Pointer) 기법을 활용하면 효율적으로 해결할 수 있습니다. 전체적인 흐름은 다음과 같습니다.리스트 nums를 오름차순으로 정렬