Python 데이터 분석을 하다 보면 하나의 숫자와 여러 개의 값을 담고 있는 리스트를 비교해야 하는 상황이 자주 발생합니다. 이번 글에서는 주어진 숫자가 리스트에 있는 모든 값보다 작은지 확인하는 방법을 소개합니다. 크게 두 가지 방식으로 구현할 수 있습니다.1. for 루프 사용하기가장 기본적인 방법은 리스트를 처음부터 끝까지 순회하면서 주어진 값과 각 요소를 하나씩 비교하는 것입니다. 리스트의 모든 값과 비교했을 때 조건이 한 번도 깨지지 않으면 yes를 출력하고, 중간에 조건을 만족하지 않는 값이 나오면 즉시 No를 출력한
데이터 분석 작업을 하다 보면 빈 딕셔너리(dictionary)를 다뤄야 하는 상황을 자주 마주하게 됩니다. 이 글에서는 Python에서 딕셔너리가 비어 있는지 확인하는 두 가지 대표적인 방법을 소개합니다.if 조건문 활용하기Python에서는 딕셔너리에 요소가 존재하면 if 조건문이 True로 평가되고, 비어 있으면 False로 평가됩니다. 이러한 특성을 활용하면 별도의 함수 없이 if 조건문만으로 딕셔너리의 빈 여부를 간단히 확인할 수 있습니다.예제 코드dict1 = {1:Mon,2:Tue,3:Wed} dict2 = {} # 주어
이 글에서는 주어진 문자열에서 각 문자가 몇 번 등장하는지 그 빈도를 구하는 방법을 알아봅니다. 이어서 두 개 이상의 문자가 서로 같은 빈도를 가지는지, 즉 모든 문자의 빈도가 서로 다른지 여부까지 확인해 보겠습니다. 전체 과정은 두 단계로 진행되며, 첫 번째 프로그램에서는 각 문자의 빈도만 계산합니다.각 문자의 빈도 구하기먼저 입력 문자열에 포함된 각 문자의 등장 횟수를 계산합니다. 빈 딕셔너리(dictionary)를 하나 선언한 뒤, 문자열을 한 글자씩 순회하면서 해당 문자를 키(key)로 사용하고 등장 횟수를 값(value)으
이 글에서는 값(value)이 리스트 형태로 저장된 딕셔너리를 다루고, 해당 리스트 값들을 모두 비우는 방법을 살펴봅니다. 크게 두 가지 접근 방식이 있습니다.반복문과 함께 clear() 메서드를 사용하는 방법딕셔너리 컴프리헨션(dictionary comprehension)으로 각 키에 빈 리스트를 할당하는 방법예제 코드x1 = {Apple : [4,6,9,2],Grape : [7,8,2,1],Orange : [3,6,2,4]} x2 = {mango : [4,6,9,2],pineapple : [7,8,2,1],cherry : [3,
cmp() 함수란? cmp()는 두 개의 정수를 비교하는 파이썬 내장 함수로, 원래 파이썬 2에서 기본적으로 제공되었습니다. 비교 결과는 다음과 같습니다. 첫 번째 정수가 두 번째보다 작으면 -1 반환 첫 번째 정수가 두 번째보다 크면 1 반환 두 값이 같으면 0 반환 참고로 파이썬 3에서는 cmp()가 표준에서 제거되었기 때문에, 아래 예제처럼 동일한 기능을 하는 함수를 직접 정의해서 사용해야 합니다. 핵심 아이디어는 간단합니다. 불리언 값 True와 False는 산술 연산에서 각각 1과 0으로 취급되므로, (x > y
파이썬 프로그래밍을 하다 보면 문자열 형태의 리스트 요소들을 실제 리스트의 리스트, 즉 중첩 리스트(nested list) 구조로 변환해야 하는 경우가 자주 발생합니다. 예를 들어 파일에서 읽어온 데이터나 외부 API로부터 받은 문자열이 [0, 1, 2, 3]처럼 리스트 모양을 하고 있을 때, 이를 실제 리스트 객체로 다루고 싶다면 적절한 변환 과정이 필요합니다.이 글에서는 문자열 데이터 타입으로 이루어진 리스트를 각 요소가 개별 문자열로 분리된 중첩 리스트로 변환하는 대표적인 두 가지 방법을 소개합니다. 내부 리스트는 숫자나 문자
지그재그 레벨 순회(Zigzag Level Order Traversal)란? 이진 트리가 주어졌을 때, 지그재그 레벨 순회는 트리를 레벨(층) 단위로 방문하되 방향을 매 층마다 번갈아 바꾸는 순회 기법입니다. 첫 번째 레벨은 왼쪽에서 오른쪽으로, 두 번째 레벨은 오른쪽에서 왼쪽으로, 세 번째 레벨은 다시 왼쪽에서 오른쪽으로 탐색하는 방식으로 진행됩니다. 예를 들어 아래와 같은 이진 트리가 있다고 가정해 보겠습니다. 이 트리를 지그재그 레벨 순회하면 결과는 [[3], [20, 9], [15, 7]]이 됩니다. 레벨 0: [3] →
문제 소개 간단한 수식 문자열을 평가하는 기본 계산기를 구현하는 것이 목표입니다. 입력 문자열에는 음수가 아닌 정수, 연산자(+, -, *, /), 그리고 공백만 포함되며, 정수 나눗셈은 몫(quotient)만 결과로 취합니다. 예를 들어 입력이 3+2*2라면 곱셈이 우선 수행되므로 출력은 7이 됩니다. 알고리즘 접근 방식 이 문제는 스택(Stack) 자료구조를 활용하면 깔끔하게 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다. 곱셈(*)과 나눗셈(/)을 만나면 즉시 직전 숫자와 연산하여 스택 최상단(top) 값을 갱신합
배열 A가 주어졌을 때, 중복 없는 숫자들의 집합을 무작위로 섞어야(shuffle) 한다고 가정해 봅시다. 예를 들어 입력이 [1,2,3]이라면 셔플 결과는 [1,3,2]가 될 수 있고, 리셋한 뒤 다시 셔플하면 [2,3,1]과 같은 새로운 순서가 나올 수 있습니다.문제 해결 접근 방법이 문제를 해결하기 위해 init(), reset(), shuffle() 세 가지 메서드를 구현합니다. 각 메서드는 다음과 같이 동작합니다.1. init() — 초기화original: 주어진 배열의 복사본을 저장합니다.temp: 원본 배열(nums)을
이진 트리의 루트 노드가 주어졌을 때, 각 노드는 0부터 25까지의 값을 가지며 이 값들은 알파벳 소문자 a부터 z에 대응됩니다. 즉, 값 0은 a, 값 1은 b와 같은 식으로 매핑됩니다. 우리가 찾아야 하는 것은 트리의 리프(leaf) 노드에서 시작하여 루트에서 끝나는 문자열 중 사전순(lexicographically)으로 가장 작은 문자열입니다.예를 들어 다음과 같은 트리가 있다고 가정해 보겠습니다.이 경우 루트까지의 경로는 [0, 3, 25]이며, 이를 역순으로 읽으면 a, d, z가 되므로 출력 결과는 adz입니다.문제 해결
문제 개요주어진 전위 순회(preorder traversal) 결과와 일치하는 이진 탐색 트리(Binary Search Tree, BST)를 만들어야 하는 문제입니다. 예를 들어 전위 순회가 [8,5,1,7,10,12]로 주어졌다면, 출력은 [8,5,10,1,7,null,12]가 되며, 이는 다음과 같은 트리 구조를 의미합니다.해결 접근 방법이 문제는 스택(stack)을 활용하면 O(n) 시간 복잡도로 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.전위 순회 리스트의 첫 번째 노드를 루트(root)로 설정합니다.빈
컨베이어 벨트 위에 있는 패키지들을 D일 안에 한 항구에서 다른 항구로 배송해야 하는 상황을 가정해 봅시다. 벨트 위의 i번째 패키지 무게는 weights[i]로 주어집니다. 매일 배에 패키지를 싣게 되며, 배의 최대 적재 용량을 초과해서 실을 수는 없습니다. 우리가 구해야 할 것은 컨베이어 벨트의 모든 패키지를 D일 이내에 전부 배송할 수 있는 배의 최소 무게 용량입니다.문제 예시예를 들어 입력이 [3, 2, 2, 4, 1, 4]이고 D = 3이라면, 출력은 6이 됩니다. 배의 용량이 6일 때 3일 만에 모든 패키지를 배송할 수
문제 소개한 명의 서점 주인이 customers 리스트 길이만큼의 시간(분) 동안 가게를 운영한다고 가정해 보겠습니다. 매 분마다 일정 수의 고객(customers[i])이 가게에 들어오고, 해당 분이 끝나면 그 고객들은 모두 떠납니다. 이때 어떤 분에는 주인이 기분이 나쁜 상태일 수 있습니다.주인이 i번째 분에 기분이 나쁘다면 grumpy[i] = 1이고, 그렇지 않다면 grumpy[i] = 0입니다. 주인이 기분이 나쁜 분에 방문한 고객들은 불행해지며, 반대로 주인이 평온한 분에 방문한 고객들은 행복해집니다.서점 주인은 자신이
문제 소개 하나의 이진 트리가 주어졌다고 가정해 보겠습니다. 특정 노드를 지나는 모든 루트-리프(root-to-leaf) 경로의 노드 값 합이 limit보다 작다면, 그 노드를 불충분한 노드(insufficient node)라고 정의합니다. 이 문제의 목표는 모든 불충분한 노드를 한 번에 삭제한 뒤, 남은 이진 트리의 루트를 반환하는 것입니다. 예를 들어 아래와 같은 트리가 있고 limit이 1이라고 해보겠습니다. 이때 기대되는 출력 트리는 다음과 같습니다. 접근 방법 이 문제는 재귀적 DFS(깊이 우선 탐색)로 자연스럽게 해
문자열 text가 주어졌을 때, text에 등장하는 모든 고유한 문자를 각각 정확히 한 번씩 포함하면서 사전순으로 가장 작은 부분 시퀀스(subsequence)를 찾는 것이 목표입니다. 예를 들어 입력이 "cdadabcc"라면 출력은 "adbc"가 됩니다. 접근 방법: 그리디 + 단조 스택 이 문제는 단조 스택(monotonic stack)과 그리디(greedy) 기법을 조합하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다. 각 문자가 마지막으로 등장하는 인덱스를 미리 기록
문제 정의R개의 행과 C개의 열로 구성된 정수 행렬 A가 주어졌을 때, [0, 0]에서 시작하여 [R-1, C-1]에서 끝나는 경로 중 최대 점수를 얻는 경로를 찾아야 합니다. 이때 경로의 점수는 해당 경로에 포함된 값들 중 최솟값으로 정의됩니다. 예를 들어, 경로 8 → 4 → 5 → 9의 점수는 4입니다.경로는 이미 방문한 칸에서 북, 동, 서, 남 네 방향 중 하나로 인접한 아직 방문하지 않은 칸으로 여러 번 이동하는 방식으로 확장됩니다.예시다음과 같은 격자가 있다고 가정해 보겠습니다 −545126746주황색으로 표시된 칸이
일련의 책들이 주어져 있다고 가정해 보겠습니다. i번째 책의 두께는 books[i][0]이고, 높이는 books[i][1]입니다. 이 책들을 주어진 순서 그대로, 전체 폭이 shelf_width인 책장에 차례로 꽂으려고 합니다. 몇 권의 책을 한 선반에 함께 놓기로 하면(두께의 합이 shelf_width 이하가 되도록), 그 위에 새로운 선반 단이 하나 더 만들어지며, 책장의 전체 높이는 해당 선반에 놓인 책들 중 가장 큰 높이만큼 증가합니다. 더 이상 놓을 책이 없을 때까지 이 과정을 반복합니다.여기서 중요한 제약 조건은, 각 단
이진 트리의 루트 노드가 주어지고, 트리의 각 노드는 고유한 값을 가진다고 가정해 보겠습니다. 이때 to_delete 배열에 포함된 값을 가진 모든 노드를 삭제하면, 트리는 여러 개의 분리된 트리 집합, 즉 포리스트(forest)가 됩니다. 우리가 해야 할 일은 이 남은 포리스트를 구성하는 각 트리의 루트 노드들을 찾아내는 것입니다.예를 들어 다음과 같은 이진 트리가 있다고 합시다.만약 삭제할 값 배열 to_delete가 [3, 5]라면, 노드 3과 5가 제거된 후 결과는 다음과 같습니다.해결 접근 방식이 문제는 재귀적 순회(DFS
문제 개요 문자열이 오직 (와 ) 문자로만 구성되고 다음 조건 중 하나를 만족할 때, 이를 유효한 괄호 문자열(Valid Parentheses String, VPS)이라고 합니다. 빈 문자열인 경우 A와 B가 각각 VPS일 때, AB 형태로 표현되는 경우 A가 VPS일 때, (A) 형태로 표현되는 경우 또한 모든 VPS S에 대해 중첩 깊이 depth(S)를 아래와 같이 정의할 수 있습니다. depth("") = 0 depth(A + B) = max(depth(A), depth(B)), 단 A와 B는 각각 V
양의 정수로 이루어진 배열 arr가 주어졌을 때, 다음 조건을 만족하는 모든 이진 트리(binary tree)를 생각해 봅시다.각 노드는 자식을 0개 또는 2개 가집니다.배열 arr의 값들은 트리를 중위 순회(inorder traversal)했을 때 각 리프 노드의 값과 순서대로 일치합니다.각 비-리프(non-leaf) 노드의 값은 왼쪽 서브트리의 최대 리프 값과 오른쪽 서브트리의 최대 리프 값을 곱한 것과 같습니다.이렇게 만들 수 있는 모든 이진 트리 중에서, 비-리프 노드 값들의 합이 가장 작아지는 경우를 찾아야 합니다. 예를