파이썬으로 데이터를 다루다 보면 숫자가 문자열 형태로 저장되어 있는 리스트를 마주치는 경우가 많습니다. 예를 들어 21, 3처럼 쉼표로 구분된 숫자 문자열들이 리스트에 담겨 있을 때, 이를 연산이나 데이터 처리에 활용하려면 튜플 형태로 변환해야 할 필요가 생깁니다.이 글에서는 문자열 리스트를 튜플 리스트로 변환하는 대표적인 두 가지 방법을 소개합니다. 각각의 장단점도 함께 살펴보겠습니다.1. map과 eval 함수 활용하기가장 간단한 방법은 map 함수를 사용해 리스트의 모든 요소에 eval을 적용하는 것입니다. eval은 문자열을
파이썬은 다양한 데이터 조작 기능을 제공하는 강력한 언어입니다. 이 글에서는 숫자 쌍이 튜플(tuple) 형태로 담긴 리스트가 주어졌을 때, 전체 요소에서 고유한 숫자(자릿수)만 추출하는 방법을 알아보겠습니다. re 모듈과 set 활용하기 정규표현식 모듈인 re에는 sub 함수가 있습니다. 이 함수는 정확한 일치 대신 정규표현식 패턴에 매칭되는 문자열을 치환하는 데 사용됩니다. 따라서 정규표현식을 설계해 튜플 리스트를 일반 문자열로 변환한 뒤, set 함수를 적용하면 중복 없이 고유한 숫자들만 손쉽게 얻을 수 있습니다. 예제 코드
파이썬 프로그래밍을 하다 보면 요소가 튜플(tuple)로 구성된 리스트를 다루게 되는 경우가 있습니다. 하지만 이후 데이터 처리 과정에서는 튜플을 풀어서 일반적인 리스트 요소로 변환해야 할 때가 많습니다. 이 글에서는 튜플 리스트를 하나의 평탄화된(flattened) 리스트로 변환하는 대표적인 세 가지 방법을 예제와 함께 살펴보겠습니다.1. 리스트 컴프리헨션(List Comprehension) 활용가장 직관적인 방법입니다. 중첩된 for 루프를 컴프리헨션으로 작성하여 각 튜플 내부의 요소를 하나씩 꺼내고, 이를 최종 리스트로 구성합
파이썬 프로그래밍을 하다 보면 요소가 튜플(tuple)로 구성된 리스트를 다루는 경우가 자주 있습니다. 그런데 데이터 처리 과정에서 튜플은 불변(immutable)하기 때문에, 값을 수정하거나 다양한 연산을 적용하려면 이를 리스트(list)로 변환해야 하는 경우가 생깁니다. 이번 글에서는 튜플로 이루어진 리스트를 리스트의 리스트로 변환하는 두 가지 대표적인 방법을 살펴보겠습니다.1. 리스트 컴프리헨션(List Comprehension) 활용리스트 컴프리헨션은 가장 직관적이고 파이썬다운 방법입니다. for 루프를 통해 외부 리스트의
Python으로 데이터를 처리하다 보면 요소가 튜플(tuple)로 구성된 리스트를 다루게 되는 경우가 있습니다. 이때 각 튜플의 요소들을 하나의 문자열로 합쳐서 문자열 리스트로 변환해야 할 필요가 생기곤 하는데요. 이 글에서는 대표적인 두 가지 방법을 예제와 함께 살펴보겠습니다.1. join() 메서드 활용하기join() 메서드는 시퀀스의 요소들을 지정한 구분자(str separator)로 연결하여 하나의 문자열로 반환합니다. 리스트 컴프리헨션(list comprehension)을 사용해 각 튜플을 join()에 전달하고, 그 결과
Python에서 데이터를 다루다 보면 하나의 숫자를 각 자릿수로 분리하여 정수 리스트로 변환해야 하는 경우가 종종 있습니다. 예를 들어 1342라는 숫자를 [1, 3, 4, 2]와 같은 리스트로 바꾸는 작업입니다. 이 글에서는 이러한 변환을 수행하는 대표적인 두 가지 방법을 살펴보겠습니다.방법 1: 리스트 컴프리헨션(List Comprehension) 사용가장 직관적인 방법은 리스트 컴프리헨션을 활용하는 것입니다. 먼저 str() 함수로 숫자를 문자열로 변환하면 각 자릿수에 개별적으로 접근할 수 있고, 이후 int() 함수를 적용해
Python을 활용한 데이터 분석 작업 중에는 데이터 컨테이너를 집합(set)에서 리스트(list)로 변환해야 하는 경우가 자주 발생합니다. 이 글에서는 이러한 요구 사항을 해결할 수 있는 대표적인 두 가지 방법을 예제와 함께 살펴보겠습니다. 1. list() 함수 사용하기 가장 간단하고 직관적인 방법은 주어진 집합에 list() 함수를 직접 적용하는 것입니다. 집합의 요소들이 그대로 리스트의 요소로 변환되며, 별도의 추가 처리 없이 한 줄로 변환이 완료됩니다. 예제 setA = {Mon, day, 7pm} # 주어진 집합 prin
파이썬으로 데이터를 처리하다 보면 {Mon : 3, Wed : 5}처럼 딕셔너리 형태를 띤 문자열을 실제 딕셔너리(dict) 객체로 변환해야 하는 경우가 자주 발생합니다. 예를 들어 API 응답, 설정 파일, 로그 데이터 등을 다룰 때 문자열 형태의 딕셔너리를 만나게 되는데, 이를 그대로 사용하면 키-값 쌍에 접근할 수 없습니다.이 글에서는 문자열 딕셔너리를 정상적인 딕셔너리 객체로 변환하는 대표적인 두 가지 방법을 소개합니다.방법 1: json.loads() 사용하기json 모듈의 json.loads() 함수는 JSON 형식의 문
문제 개요입력 문자열 s와 패턴 문자열 p가 주어졌다고 가정해 봅시다. 여기서 s는 원본 문자열이고, p는 매칭에 사용할 패턴입니다. 우리는 문자열 안에서 패턴과 일치하는 부분을 찾아내는 메서드를 하나 정의해야 합니다. 즉, 다음 두 특수 문자를 지원하는 정규 표현식 매칭 기능을 직접 구현하는 것이 목표입니다.점(.) — 임의의 단일 문자 하나와 일치합니다.별표(*) — 바로 앞에 있는 문자가 0번 이상 반복되는 경우와 일치합니다.예를 들어, 입력이 s = aa, p = a.라면 .이 임의의 한 글자와 대응되므로 결과는 True입니
여러 개의 정렬된 리스트가 주어졌을 때, 이것들을 하나의 정렬된 리스트로 병합해야 하는 상황을 생각해 봅시다. 이 문제는 힙(Heap) 자료구조를 활용하면 효율적으로 해결할 수 있습니다.예를 들어 정렬된 리스트가 [1,4,5], [1,3,4], [2,6] 세 개 있다면, 병합한 최종 결과는 [1,1,2,3,4,4,5,6]이 됩니다. 알고리즘 접근 방식 핵심 아이디어는 각 리스트의 현재 헤드 노드만 최소 힙(min-heap)에 유지하고, 가장 작은 값을 가진 노드를 꺼내 결과 리스트에 차례로 연결하는 것입니다. 노드를 꺼낼 때마다 그
문자열이 주어졌을 때, 그 안에서 가장 긴 유효한(well-formed) 괄호의 길이를 구하는 문제를 살펴보겠습니다. 예를 들어 입력 문자열이 ))(())()) 라면, 가장 긴 유효한 부분 문자열은 (())() 이므로 결과는 6이 됩니다.해결 접근 방식이 문제는 스택(Stack) 자료구조를 활용하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 여는 괄호의 인덱스를 스택에 저장하고, 닫는 괄호가 나올 때마다 짝이 맞는지 확인하는 것입니다.알고리즘 단계스택을 생성하고 초기값으로 -1을 삽입합니다. 이 값은 계산 기준점 역할을 하며,
정렬되지 않은 정수 배열이 하나 주어졌다고 가정해 보겠습니다. 이때 배열에 존재하지 않는 가장 작은 양의 정수를 찾아야 합니다. 예를 들어 배열이 [4, -3, 1, -1]이라면 1은 존재하지만 2는 없으므로 결과는 2가 됩니다.문제 해결 접근 방법이 문제는 인덱스 기반 자리 바꾸기 기법을 활용하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 각 양수 값을 자신이 있어야 할 인덱스 위치로 옮긴 뒤, 배열을 순회하면서 기대하는 값과 실제 값이 처음 어긋나는 지점을 찾는 것입니다. 음수와 범위를 벗어나는 값은 무시됩니다.구체적인 해
빗물 가두기(Trapping Rain Water) 문제란?n개의 음수가 아닌 정수로 이루어진 배열이 있다고 가정해 봅시다. 이 배열은 각 막대의 너비가 1인 고도 지도(elevation map)를 나타내며, 비가 내린 후 이 지형에 얼마나 많은 물을 가둘 수 있는지 계산하는 것이 목표입니다. 예를 들어 다음과 같은 지형이 있다고 할 때 −위 그림에서 파란색으로 표시된 물웅덩이가 총 6칸이므로, 결과값은 6이 됩니다.이 문제는 각 위치에서 왼쪽과 오른쪽 경계 중 더 낮은 높이만큼 물이 차오른다는 원리를 이용하며, 스택(stack) 자
문제 개요입력 문자열 s와 패턴 문자열 p가 주어졌다고 가정해 봅시다. 이때 s는 원본 문자열이고, p는 비교 대상이 되는 패턴입니다. 우리는 이 문자열 안에서 패턴과 일치하는 부분을 찾아내는 메서드를 정의해야 합니다. 즉, 와일드카드 문자인 물음표(?)와 별표(*)를 지원하는 정규식 스타일의 매칭 기능을 직접 구현하는 것이 목표입니다.각 와일드카드 문자의 역할은 다음과 같습니다.물음표(?) : 임의의 한 글자와 일치합니다.별표(*) : 0개 이상의 연속된 문자와 일치합니다.예를 들어, 입력이 s = aa, p = a?라면 결과는
문제 개요모든 요소가 양수인 정수 배열이 하나 주어진다고 가정해 봅시다. 시작 지점은 배열의 첫 번째 위치(인덱스 0)이며, 각 요소는 해당 위치에서 점프할 수 있는 최대 점프 길이를 의미합니다. 우리의 목표는 가장 적은 점프 횟수로 배열의 마지막 칸에 도달하는 것입니다.예를 들어 배열이 [2,3,1,1,4]라고 한다면 정답은 2입니다. 인덱스 0에서 인덱스 1로 점프한 뒤, 다시 인덱스 4(마지막 인덱스)로 점프하면 총 2번의 점프만으로 목표에 도달할 수 있기 때문입니다.풀이 전략: 그리디 알고리즘이 문제는 그리디(Greedy)
문자열이 주어졌을 때, 해당 문자열이 유효한 숫자를 나타내는지 확인해야 하는 경우가 자주 있습니다. 예를 들어 0.2, abc, hello, -2.5, 10 같은 문자열이 입력으로 주어지면, 결과는 각각 True, False, False, True, True가 되어야 합니다.해결 접근 방식이 문제는 프로그래밍 언어에서 제공하는 문자열 파싱(string parsing) 기법을 활용하면 간단하게 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.문자열을 숫자로 변환을 시도합니다.변환 과정에서 예외(exception)가 발생하지 않으
정수 배열로 히스토그램의 각 막대 높이가 주어졌다고 가정해 보겠습니다. 각 막대의 너비는 1로 고정되어 있습니다. 이때 우리가 구해야 할 것은 히스토그램 안에 포함될 수 있는 가장 큰 직사각형의 넓이입니다.예를 들어, 높이 배열 [2, 1, 5, 7, 3, 2]가 주어지면 인접한 막대들을 조합하여 만들 수 있는 최대 직사각형의 넓이는 12가 됩니다.문제 해결 접근 방식모든 막대 조합을 일일이 확인하는 브루트 포스 방식은 시간이 오래 걸립니다. 대신 스택(Stack) 자료구조를 활용하면 O(n)의 시간 복잡도로 효율적으로 해결할 수
문제 설명주식 가격이 담긴 배열이 주어졌을 때, 배열의 i번째 요소는 i일째 되는 날의 주식 가격을 의미합니다. 이때 최대 두 번의 거래만 허용되며, 얻을 수 있는 최대 이익을 구하는 알고리즘을 설계해야 합니다.예를 들어, 주어진 가격 배열이 [3,3,5,0,1,3,1,4]라면 결과는 6이 됩니다. 그 이유는 다음과 같습니다.4일째 되는 날 가격 0에 매수하고, 6일째 되는 날 가격 3에 매도 → 이익 3 − 0 = 37일째 되는 날 가격 1에 매수하고, 8일째 되는 날 가격 4에 매도 → 이익 4 − 1 = 3두 거래의 이익을 합
비어 있지 않은 하나의 이진 트리가 주어졌을 때, 최대 경로 합(Maximum Path Sum)을 구하는 문제를 살펴보겠습니다.여기서 경로(path)란 부모-자식 연결이 존재하는 임의의 시작 노드에서 시작하여 다른 노드까지 이어지는 노드들의 시퀀스를 의미합니다. 경로에는 반드시 최소 한 개 이상의 노드가 포함되어야 하며, 루트 노드를 반드시 거칠 필요는 없습니다.예를 들어 다음과 같은 입력 트리가 있다고 가정해 보겠습니다.이 경우 출력 결과는 32가 됩니다.문제 해결 접근 방법이 문제는 재귀적 후위 순회(post-order trav
정수 배열이 주어졌을 때, 가장 긴 연속된 요소 시퀀스의 길이를 구하는 문제를 살펴보겠습니다. 예를 들어 입력이 [100, 4, 250, 1, 3, 2]라면, 가장 긴 연속 시퀀스는 [1, 2, 3, 4]이므로 정답은 4가 됩니다.문제 해결 접근 방식이 문제의 핵심은 각 숫자가 연속 시퀀스의 시작점인지 판별하는 것입니다. 시작점이라는 것은 자신보다 1 작은 숫자(i-1)가 집합에 존재하지 않는 경우를 의미합니다. 이렇게 하면 불필요한 중복 탐색을 피할 수 있어 전체 시간 복잡도를 O(n)으로 유지할 수 있습니다.해결 과정은 다음과