문제 이해하기 상자들의 목록이 주어졌다고 가정해 보겠습니다. 각 행은 해당 상자의 너비(width)와 높이(height)를 나타냅니다. 어떤 상자의 너비와 높이가 모두 다른 상자보다 작을 경우, 그 상자를 다른 상자 안에 넣을 수 있습니다. 우리의 목표는 하나의 상자 안에 최대 몇 개의 상자까지 중첩해서 넣을 수 있는지 구하는 것입니다. 예시 너비높이1212101066510 위 입력의 경우 출력은 3입니다. [6, 6] 상자를 [10, 10] 상자 안에 넣을 수 있고, 그 상자를 다시 [12, 12] 상자 안에 넣을 수 있기 때문입
문자열이 단어 목록으로 나누어지는지 확인하는 파이썬 프로그램단어 목록(words)과 공백이 포함되지 않은 하나의 문자열 s가 주어졌다고 가정해 보겠습니다. 이때 확인해야 할 것은 문자열 s가 주어진 단어 목록에 있는 단어들의 조합으로 완전히 분해될 수 있는지 여부입니다.예를 들어, words = [love, python, we, programming, language]이고 s = welovepythonprogramming이라면, 이 문자열은 we + love + python + programming으로 나눌 수 있으므로 출력 결과는
시간 순서대로 정렬된 주식 가격 리스트 prices가 주어졌을 때, 주식을 최대 두 번 사고팔아 얻을 수 있는 최대 수익을 구하는 문제를 살펴보겠습니다. 단, 반드시 먼저 매수한 후에 매도해야 하며, 두 번째 매수는 첫 번째 매도 이후에 이루어져야 합니다.문제 예시입력이 prices = [2, 6, 3, 4, 2, 9]라면 출력은 11이 됩니다. 가격 2에 매수한 후 6에 매도하고(+4), 다시 가격 2에 매수한 뒤 9에 매도하면(+7) 총 수익이 11이 되기 때문입니다.풀이 전략이 문제는 네 개의 상태 변수를 이용해 한 번의 순회
문제 개요숫자로 이루어진 리스트 nums와 정수 k가 주어집니다. 이때 nums[i]는 인덱스 i에 착지했을 때 발생하는 비용을 의미합니다. 우리는 인덱스 0에서 출발하여 리스트의 마지막 인덱스에 도달해야 하며, 각 단계에서 현재 위치 X로부터 최대 k칸 떨어진 어떤 위치로든 점프할 수 있습니다.목표는 마지막 인덱스에 도달하기 위해 지불해야 하는 비용의 합을 최소화하는 것입니다. 그렇다면 최소 비용은 얼마일까요?예시입력이 다음과 같다고 가정해 보겠습니다.nums = [2, 3, 4, 5, 6]k = 2이 경우 출력은 12가 됩니다.
시간 순서대로 정렬된 주가 목록 nums와 정수 k가 주어졌을 때, 최대 k번의 매수와 매도를 통해 얻을 수 있는 최대 수익을 구하는 프로그램을 만들어 보겠습니다. 단, 반드시 매수 후에 매도해야 하며, 매도한 뒤에만 다시 매수할 수 있다는 조건이 있습니다.예를 들어 prices = [7, 3, 5, 2, 3]이고 k = 2라면 출력은 3이 됩니다. 가격이 3일 때 매수하여 5일 때 매도하고(+2), 다시 2일 때 매수하여 3일 때 매도하면(+1) 총 수익이 3이 되기 때문입니다.문제 해결 접근 방식이 문제는 재귀 호출과 동적 계획
문제 소개덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/) 연산자로 이루어진 수학 표현식 문자열이 주어졌을 때, 파이썬의 내장 함수를 사용하지 않고 이 표현식을 직접 평가하여 결과를 반환하는 프로그램을 작성해 보겠습니다. 여기서 나눗셈(/)은 정수 나눗셈을 의미합니다.예를 들어 입력이 s = "2+3*5/7"이라면 출력은 4가 됩니다. 연산자 우선순위에 따라 2 + ((3 * 5) / 7) = 2 + (15 / 7) = 2 + 2 = 4로 계산되기 때문입니다.해결 접근 방법이 문제의 핵심은 연산자 우선순위를 올바르
문제 개요n × 3 크기의 행렬이 주어집니다. 각 행은 [src, dest, id] 세 개의 필드로 구성되며, 이는 해당 버스가 src(출발지)에서 dest(도착지)까지 운행한다는 의미입니다. 새로운 버스에 탑승할 때마다 1단위의 비용이 들지만, 같은 버스에 계속 타고 있는 동안에는 추가 비용이 발생하지 않습니다. 위치 0에서 출발해 가장 먼 최종 정류장(주어진 위치 중 가장 큰 값)까지 이동하는 데 필요한 최소 비용을 구하고, 경로가 존재하지 않으면 -1을 반환해야 합니다.입력 예시출발지(src)도착지(dest)버스 ID01012
N×N 크기의 이진 행렬이 있다고 가정해 보겠습니다. 여기서 0은 빈 셀(empty cell), 1은 막힌 셀(blocked cell)을 의미합니다. 이때 모든 행과 모든 열에 최소 하나의 선택된 셀이 포함되도록 N개의 빈 셀을 선택하는 방법의 수를 구해야 합니다. 답이 매우 커질 수 있으므로, 결과는 10^9 + 7로 나눈 나머지를 반환합니다. 문제 예시 예를 들어 입력이 다음과 같다고 해보겠습니다. 000000010 이 경우 출력은 4입니다. x를 선택된 셀이라고 할 때, 조건을 만족하는 배치가 총 4가지 존재하기 때문입
문제 개요 숫자로 이루어진 리스트 nums가 주어졌을 때, 가장 긴 증가 부분 수열(Longest Increasing Subsequence)의 길이를 구하는 문제입니다. 특별한 조건은 부분 수열이 리스트의 끝에 도달하면 다시 처음으로 돌아가 이어질 수 있다는 점, 즉 리스트를 원형(circular) 구조로 취급한다는 것입니다. 예를 들어 입력이 nums = [6, 5, 8, 2, 3, 4]라면 정답은 5입니다. 리스트의 끝에서 처음으로 감싸 연결했을 때 가장 긴 증가 부분 수열이 [2, 3, 4, 6, 8]이 되기 때문입니다.
문제 개요데카르트 좌표계의 점들로 구성된 리스트 [(x1, y1), (x2, y2), ..., (xn, yn)]가 하나의 다각형(polygon)을 나타낸다고 가정해 봅시다. 여기에 두 값 x와 y가 추가로 주어졌을 때, 점 (x, y)가 이 다각형의 내부 또는 경계선 위에 존재하는지 판별하는 것이 목표입니다.예를 들어 입력이 다음과 같다고 해보겠습니다.points = [(0, 0), (1, 3), (4, 4), (6, 2), (4, 0)]pt = (3, 1)점 (3, 1)은 다각형 내부에 위치하므로 출력은 True가 됩니다.풀이 접
숫자로 이루어진 리스트 nums와 정수 k가 주어졌을 때, 리스트의 요소들 중 합이 정확히 k가 되는 부분 집합(subset)의 개수를 구하는 문제입니다. 답이 매우 커질 수 있으므로 결과는 10^9 + 7로 나눈 나머지를 반환해야 합니다. 예를 들어 입력이 nums = [2, 3, 4, 5, 7], k = 7이라면 출력은 3이 됩니다. [2, 5], [3, 4], [7] 세 가지 부분 집합을 만들 수 있기 때문입니다. 문제 해결 접근 방식 이 문제는 동적 계획법(Dynamic Programming)을 활용하면 효율적으로 해결할 수
문제 소개 어떤 나라가 N개의 노드와 N-1개의 간선으로 이루어진 트리(tree) 구조로 표현되어 있다고 가정해 보겠습니다. 각 노드는 하나의 마을을 나타내고, 각 간선은 마을 사이를 잇는 도로를 의미합니다. 크기가 N-1인 두 리스트 source와 dest가 주어지며, i번째 도로는 source[i]와 dest[i]를 연결하고 모든 도로는 양방향입니다. 또한 크기가 N인 population 리스트에는 population[i] 값으로 i번째 마을의 인구가 담겨 있습니다. 우리는 몇 개의 마을을 도시로 승격시키려고 합니다. 이때 다
문자열 s가 주어졌을 때, 최대 k개의 문자를 삭제하여 이 문자열을 회문(palindrome)으로 만들 수 있는지 확인하는 문제입니다.예를 들어 s = lieuvrel, k = 4라고 가정해 보겠습니다. 이 경우 세 개의 문자를 삭제하면 회문인 level을 얻을 수 있으므로 결과는 True가 됩니다.해결 접근 방법이 문제는 최장 공통 부분 수열(LCS, Longest Common Subsequence) 알고리즘을 활용하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.문자열 s와 그 역순 문자열의 LCS 길이를 구
이번 문제에서는 0과 1로 이루어진 2진 행렬(binary matrix)과 정수 k가 주어집니다. 우리는 이 행렬을 k개의 조각으로 나누되, 각 조각에 최소한 하나의 1이 포함되도록 해야 합니다.단, 잘라내는 과정에는 다음과 같은 규칙이 있습니다.먼저 자를 방향을 선택합니다 — 세로(vertical) 또는 가로(horizontal).행렬에서 잘라낼 인덱스를 지정하여 두 부분으로 나눕니다.세로로 자른 경우: 왼쪽 부분은 더 이상 자를 수 없고, 오른쪽 부분만 계속 잘라야 합니다.가로로 자른 경우: 위쪽 부분은 더 이상 자를 수 없고,
문제 개요2차원 행렬이 주어졌을 때, 임의의 칸에서 출발하여 같은 값을 가진 인접한 칸(위, 아래, 왼쪽, 오른쪽)으로만 이동한 뒤, 다시 시작 지점으로 돌아올 수 있는지 확인하는 문제입니다. 단, 바로 직전에 방문했던 칸으로는 되돌아갈 수 없다는 제약 조건이 있습니다.예를 들어 다음과 같은 행렬이 입력으로 주어진다고 가정해 보겠습니다.222121212221이 경우 출력은 True가 됩니다. 값이 2인 칸들을 따라 이동하면 시작 지점으로 되돌아오는 순환 경로를 만들 수 있기 때문입니다.해결 접근 방법이 문제는 그래프 탐색 기법인 D
문제 설명웹사이트로 들어오는 요청 목록이 주어졌다고 가정해 보겠습니다. 각 요청은 [uid, time_sec] 형태로 표현되며, uid는 사용자 ID, time_sec는 요청이 발생한 타임스탬프(초 단위)를 의미합니다. 즉, 해당 사용자가 time_sec 시점에 웹사이트에 요청을 보냈다는 뜻입니다.여기에 두 개의 제한 값이 추가로 주어집니다.u: 특정 사용자(uid)가 60초 미만의 시간 창(window) 내에서 허용되는 최대 요청 수g: 전체 시스템 기준으로 60초 미만의 시간 창 내에서 허용되는 최대 요청 수각 요청을 순서대로
이 글에서는 NumPy 배열을 활용해 pandas의 Series(시리즈) 데이터 구조를 만드는 방법과, 인덱스(index) 값을 직접 지정하는 방법을 살펴보겠습니다.시리즈를 생성할 때 인덱스 값을 별도로 지정하지 않으면 기본적으로 0부터 시작하는 정수가 순서대로 할당됩니다. 하지만 필요에 따라 사용자가 원하는 값을 인덱스로 직접 전달할 수 있습니다.예제 코드import pandas as pd import numpy as np my_data = np.array([ab,bc,cd,de, ef, fg,gh, hi]) my_index =
데이터 시각화는 분석 과정에서 매우 중요한 단계입니다. 복잡한 계산을 수행하거나 숫자를 일일이 살펴보지 않아도, 시각화를 통해 데이터 안에서 어떤 일이 일어나고 있는지 직관적으로 파악할 수 있기 때문입니다. Seaborn은 이러한 데이터 시각화를 손쉽게 도와주는 대표적인 파이썬 라이브러리입니다.산점도란 무엇인가?산점도(Scatter Plot)는 데이터 포인트들을 그래프 위에 흩어진 점 형태로 표현하여 데이터의 분포를 보여주는 차트입니다. 각 점(dot)은 수치형(numeric) 데이터셋의 값을 나타내며, 가로축과 세로축 위에서 점의
스칼라(scalar) 또는 상수 값은 한 번만 정의되며, 시리즈 데이터 구조의 모든 행(엔트리)에 걸쳐 반복됩니다. 즉, 하나의 값만 지정해도 인덱스 길이에 맞춰 해당 값이 전체에 자동으로 채워지는 방식입니다.다음은 사용자 정의 인덱스와 함께 스칼라 값을 사용해 시리즈를 생성하는 예제입니다.예제 1: 인덱스를 지정한 경우import pandas as pdmy_index = [ab, mn, gh, kl]my_series = pd.Series(7, index = my_index)print(스칼라 값과 인덱스를 지정하여 생성한 시리즈 데
Pandas의 Series는 생성 시 인덱스를 따로 지정하지 않으면 0부터 시작하는 정수형 기본 인덱스가 자동으로 부여됩니다. 이 경우 일반적인 인덱싱 방식으로 요소에 접근할 수 있습니다. 반면, 사용자 정의 인덱스를 지정했다면 문자열 등의 커스텀 인덱스 값을 그대로 사용해 요소에 접근하고 결과를 콘솔에 출력할 수 있습니다.아래 예제를 통해 구체적으로 살펴보겠습니다.예제 코드import pandas as pd my_data = [34, 56, 78, 90, 123, 45] my_index = [ab, mn ,gh,kl, wq, az