이번 글에서는 두 개의 숫자 start와 end가 주어졌을 때, [start, end] 범위(양 끝값 포함)에 속하면서 자릿수가 연속적으로 증가하는 모든 숫자를 정렬된 리스트 형태로 찾는 방법을 알아보겠습니다.연속적으로 증가하는 숫자란?연속적으로 증가하는 숫자란 각 자릿수가 왼쪽에서 오른쪽으로 갈수록 정확히 1씩 커지는 수를 의미합니다. 예를 들어 5678은 5 → 6 → 7 → 8로 연속적으로 증가하므로 해당되지만, 169는 1과 6 사이가 연속적이지 않으므로 해당되지 않습니다.문제 예시입력이 다음과 같다고 가정해 보겠습니다.st
시계열 데이터를 다룰 때 DateTimeIndex에 저장된 날짜·시간 값에서 시(hour) 정보만 따로 추출해야 하는 경우가 자주 있습니다. 이럴 때 Pandas의 DateTimeIndex.hour 속성을 사용하면 간단하게 해결할 수 있습니다.먼저 필요한 라이브러리를 임포트합니다.import pandas as pdDatetimeIndex 생성하기기간(periods)은 6개, 빈도(freq)는 H(시간 단위)로 설정하여 DatetimeIndex를 생성합니다. 타임존(timezone)은 호주 시드니(Australia/Sydney)로 지
문제 설명 구간(interval)들의 목록이 주어졌다고 가정해 보겠습니다. 목록의 각 항목 intervals[i]는 [시작(start), 끝(end)] 형태의 값을 가집니다. 우리가 구해야 할 값은 다른 구간 안에 완전히 포함되는 구간의 개수입니다. 단, 하나의 구간이 여러 구간에 동시에 포함되더라도 한 번만 계산합니다. 구간 [s0, e0]가 다른 구간 [s1, e1] 안에 완전히 포함되려면 s1 ≤ s0이고 e0 ≤ e1을 만족해야 합니다. 예를 들어 입력이 intervals = [[2, 6], [3, 4], [4, 7], [5
문제 소개2차원 이진 행렬(binary matrix)이 주어졌을 때, 모든 원소가 1로 이루어진 정사각형 부분 행렬이 몇 개나 존재하는지 구해야 합니다.예를 들어, 다음과 같은 행렬이 입력으로 주어진다고 가정해 보겠습니다.011011이 경우 출력은 5가 됩니다. 크기가 (2 × 2)인 정사각형이 하나 있고, (1 × 1)짜리 작은 정사각형이 네 개 있기 때문입니다.해결 접근법: 동적 프로그래밍(DP)이 문제는 동적 프로그래밍 기법으로 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.행렬의 각 위치 (i, j)에서,
이진 문자열 s가 주어졌을 때, 1로만 이루어진 부분 문자열의 개수를 구하는 문제를 살펴보겠습니다. 만약 답이 너무 크다면 결과를 10^9+7로 나눈 나머지를 반환하면 됩니다.문제 이해하기예를 들어 입력이 s = 100111이라면 출력은 7이 됩니다. 1로만 이루어진 부분 문자열은 [1, 1, 1, 1, 11, 11, 111]로 총 7개이기 때문입니다.해결 접근 방법이 문제는 각 위치에서 끝나는 1 부분 문자열의 개수를 누적하는 방식으로 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.변수 a와 count를 0으로
문제 설명양수로만 이루어진 리스트 nums가 있다고 가정해 보겠습니다. 이제 다음과 같은 연산을 수행할 수 있습니다. 리스트에서 두 값 a와 b(a ≤ b)를 제거한 뒤, 만약 a < b라면 그 차이인 b-a를 다시 리스트에 삽입하는 것입니다. 이 연산은 원하는 만큼 몇 번이든 반복할 수 있으며, 우리의 목표는 마지막에 남길 수 있는 가장 작은 숫자를 구하는 것입니다. 만약 리스트가 완전히 비게 된다면 0을 반환하면 됩니다.예를 들어 입력이 nums = [2, 4, 5]라고 한다면 출력은 1이 됩니다. 먼저 4와 5를 선택해
양의 정수로 이루어진 리스트가 있으며, 각 숫자는 리본의 길이를 나타냅니다. 또한 필요한 리본의 개수를 뜻하는 값 k가 주어집니다. 리본은 원하는 만큼 몇 번이고 잘라낼 수 있으며, 이때 길이 r인 리본을 최소 k개 확보할 수 있는 가장 큰 r을 구하는 것이 목표입니다. 만약 그러한 값이 존재하지 않는다면 -1을 반환해야 합니다.문제 예시입력이 ribbons = [1, 2, 5, 7, 15], k = 5라고 가정해 보겠습니다. 이 경우 출력은 5입니다.그 이유는 다음과 같습니다.길이 15짜리 리본을 길이 5짜리 조각 3개로 자릅니다
문제 설명막대 길이 목록 rodLen과 두 개의 정수 profit(단위 길이당 이익), cost(절단 1회당 비용)가 주어졌다고 가정해 보겠습니다. 막대의 단위 길이마다 이익을 얻을 수 있지만, 판매할 수 있는 막대는 모두 길이가 서로 같아야 합니다. 또한 막대를 정수 길이를 가진 두 조각으로 자를 수 있으며, 절단할 때마다 cost만큼의 비용을 지불해야 합니다. 막대는 원하는 만큼 몇 번이든 잘라도 됩니다. 이때 얻을 수 있는 최대 이익을 구하는 것이 목표입니다.예를 들어 입력이 rodLen = [7, 10], profit = 6
두 개의 소문자 문자열 s와 t가 있다고 가정해 보겠습니다. 이때 우리는 두 문자열 중 어느 한쪽에서든 임의의 문자를 삭제할 수 있는 연산을 수행할 수 있습니다. 목표는 s와 t를 완전히 동일하게 만들기 위해 필요한 최소 연산(삭제) 횟수를 찾는 것입니다.예를 들어, 입력이 s = pipe, t = ripe라고 한다면 출력은 2가 됩니다. s에서 p를, t에서 r을 각각 삭제하면 두 문자열이 모두 ipe로 같아지기 때문입니다.풀이 접근 방식이 문제는 최장 공통 부분 수열(LCS)과 밀접한 관련이 있습니다. 두 문자열에서 공통으로 유
양의 정수로 이루어진 리스트 nums와 양의 정수 k가 주어졌다고 가정해 보겠습니다. 우리는 리스트에서 일부 요소를 삭제한 뒤, 남은 요소들의 합이 k로 나누어떨어지도록 만들어야 합니다. 이때 삭제할 수 있는 가장 짧은 연속 부분 리스트(빈 리스트도 허용)의 길이를 구하는 것이 목표입니다.단, 전체 리스트를 통째로 삭제하는 것은 허용되지 않습니다. 또한 조건을 만족하는 부분 리스트가 존재하지 않는다면 -1을 반환해야 합니다.예시입력이 nums = [5, 8, 6, 3], k = 8이라고 해봅시다. 현재 요소들의 합은 5 + 8 +
문제 소개 문자열 s가 주어졌을 때, s에서 만들 수 있는 중복되지 않는 비어 있지 않은 부분 문자열(distinct non-empty substrings)의 개수를 구하는 것이 목표입니다. 예를 들어 입력이 s = abaa라면, 가능한 부분 문자열은 [a, b, ab, ba, aa, aba, baa, abaa]로 총 8가지이므로 결과값은 8이 됩니다. 접근 방법: 트라이(Trie) 활용 이 문제는 트라이(Trie) 자료구조를 이용하면 효율적으로 해결할 수 있습니다. 문자열의 모든 시작 위치에서 끝까지 탐색하며 각 부분 문자열을
문제 설명 소문자로만 구성된 문자열 s가 주어져 있다고 가정해 보겠습니다. 우리는 문자열 안에서 임의의 문자를 삭제, 삽입, 또는 다른 문자로 교체하는 세 가지 연산을 자유롭게 사용할 수 있습니다. 목표는 어떤 문자열 t에 대해서든 s = t + t, 즉 동일한 문자열 두 개를 이어 붙인 형태가 되도록 만드는 데 필요한 최소 연산 횟수를 구하는 것입니다. 예를 들어 입력이 s = pqrxqsr이라면 정답은 2입니다. x를 p로 바꾸고 s를 삭제하면 문자열이 pqrpqr이 되는데, 이는 t = pqr일 때의 t + t와 정확히 일치하
Python의 Pandas 라이브러리에서 특정 시계열 빈도로 생성된 DateTimeIndex에서 분(minute) 값을 추출하려면 DateTimeIndex.minute 속성을 사용하면 됩니다. 이 속성은 인덱스에 포함된 각 타임스탬프의 분 정보를 정수형 배열(Int64Index) 형태로 반환합니다.1. 필요한 라이브러리 임포트가장 먼저 pandas 라이브러리를 불러옵니다.import pandas as pd2. DatetimeIndex 생성시작 시점을 2021-10-20 02:30:55로 지정하고, 총 6개의 구간(periods=6)
Pandas의 DateTimeIndex에서 초(second) 값을 추출하려면 DateTimeIndex.second 속성을 사용하면 됩니다. 이 속성은 시계열 인덱스에 포함된 각 날짜·시간 값의 초 부분만 별도로 가져와 정수 형태의 Index로 반환합니다. 1. 필요한 라이브러리 불러오기 먼저 Pandas 라이브러리를 임포트합니다. import pandas as pd 2. DateTimeIndex 생성하기 pd.date_range() 함수를 사용해 시작 시점부터 총 6개의 타임스탬프를 생성합니다. 빈도(freq)는 S, 즉 1초 단위
특정 시계열 빈도가 설정된 DateTimeIndex에서 마이크로초(microsecond)를 추출하려면 DateTimeIndex.microsecond 속성을 사용합니다. 이 속성은 인덱스 내 각 타임스탬프의 마이크로초 값을 정수 배열 형태로 반환합니다. 라이브러리 임포트 먼저 필요한 pandas 라이브러리를 임포트합니다. import pandas as pd DatetimeIndex 생성하기 기간(periods)은 6으로, 빈도(freq)는 us, 즉 마이크로초로 지정하여 DatetimeIndex를 생성합니다. 시간대는 호주 시드니
Python datetime.date 객체로 구성된 numpy 배열을 반환하려면 Pandas의 DatetimeIndex.date 속성을 사용하면 됩니다. 이 속성은 타임스탬프(Timestamp)에서 시간대(timezone) 정보를 제외한 날짜 부분만 추출하여 numpy 배열 형태로 반환해 줍니다.라이브러리 임포트먼저 필요한 라이브러리를 불러옵니다.import pandas as pdDatetimeIndex 생성기간(periods)을 3으로 설정하고, 빈도(freq)는 나노초(ns) 단위로 지정하며, 시간대는 호주 시드니(Austral
값 h와 숫자 목록 blacklist가 주어진 상황을 가정해 보겠습니다. 우리는 현재 높이 h에 서 있고, 작은 공 하나를 높이 0까지 굴려 내리는 게임을 진행하고 있습니다. 게임의 규칙은 다음과 같습니다.짝수 번째 라운드(0부터 시작)에는 공을 1칸, 2칸, 또는 4칸 아래로 이동할 수 있습니다.홀수 번째 라운드에는 공을 1칸, 3칸, 또는 4칸 아래로 이동할 수 있습니다.일부 층(높이)은 블랙리스트에 등록되어 있으며, 공이 이 칸에 도달하면 즉시 사라집니다.목표는 블랙리스트 칸을 피하면서 공이 높이 0에 도달하는 서로 다른 경로
Pandas에서 DateTimeIndex.nanosecond 속성을 사용하면 특정 시계열 빈도로 구성된 DateTimeIndex에서 나노초(nanosecond) 값을 손쉽게 추출할 수 있습니다. 이 글에서는 나노초 단위 빈도(freq=ns)를 가진 DatetimeIndex를 만들고, 각 시점의 나노초 값을 가져오는 과정을 예제와 함께 살펴보겠습니다.1. 라이브러리 임포트가장 먼저 필요한 라이브러리를 임포트합니다.import pandas as pd2. 나노초 빈도의 DatetimeIndex 생성기준 시각 2021-10-20 02:30
Python의 datetime.time 객체로 구성된 NumPy 배열을 반환하려면 Pandas의 DatetimeIndex.time 속성을 사용하면 됩니다. 이 속성은 타임스탬프(Timestamp)에서 날짜 정보를 제외하고 시간 부분만 추출하여 배열 형태로 제공합니다. 1단계: 라이브러리 임포트 먼저 필요한 라이브러리를 임포트합니다. import pandas as pd 2단계: DatetimeIndex 생성 기간(periods)은 3으로, 빈도(freq)는 나노초(ns)로 설정하여 DatetimeIndex를 생성합니다. 타임존(tim
Pandas에서 시간대(timezone) 정보가 포함된 datetime.time 객체로 구성된 NumPy 배열을 반환하려면 DatetimeIndex의 timetz 속성을 사용하면 됩니다. 이 속성은 Timestamp에서 날짜를 제외한 시간 부분만 추출하면서, 해당 값에 적용된 시간대 정보까지 함께 유지해 줍니다. 필수 라이브러리 임포트 먼저 필요한 라이브러리를 임포트합니다. import pandas as pd DatetimeIndex 생성 pd.date_range()를 사용하여 시작 시점부터 총 5개의 요소를 가지는 Datetime