문자열로 이루어진 튜플이 있을 때, 각 문자열의 첫 번째 문자만 모아서 새로운 리스트를 만들어야 하는 경우가 자주 있습니다. 예를 들어 요일 약어 튜플에서 각 요일의 첫 글자만 추출하는 상황을 생각해 볼 수 있습니다. 이번 글에서는 두 가지 방법을 소개합니다.방법 1: 인덱스 활용가장 직관적인 방법은 for 루프를 사용해 튜플의 각 요소를 순회하면서 인덱스 0으로 첫 번째 문자를 추출하는 것입니다. 이후 list() 함수를 적용해 결과를 리스트로 변환합니다.예제tupA = (Mon, Tue, Wed, Fri) # 주어진 튜플 pri
Python 리스트에 True/False 또는 0/1과 같은 값만 담겨 있을 때, 이를 이진 리스트(binary list)라고 부릅니다. 이번 글에서는 이진 리스트를 다루면서, 리스트 요소가 True로 평가되는 위치의 인덱스를 찾아내는 두 가지 방법을 소개합니다.방법 1: enumerate() 활용하기enumerate() 함수는 리스트를 순회하면서 각 요소와 함께 해당 인덱스도 함께 반환합니다. 여기에 조건문을 결합하면 값이 True로 평가되는 요소의 인덱스만 손쉽게 걸러낼 수 있습니다.예제 코드listA = [True, False
파이썬 딕셔너리(dictionary)는 키(key)와 값(value)이 한 쌍을 이루는 자료구조입니다. 보통은 키를 알고 있을 때 값을 조회하지만, 이 글에서는 그 반대로 값을 알고 있을 때 해당하는 키를 찾는 방법을 소개합니다.방법 1: index()와 values() 활용딕셔너리의 keys()와 values() 메서드를 리스트로 변환한 뒤, 리스트의 index() 함수로 특정 값의 위치(인덱스)를 찾고, 키 리스트에서 같은 위치에 있는 요소를 꺼내는 방식입니다.예제dictA = {Mon: 3, Tue: 11, Wed: 8} #
파이썬 딕셔너리는 키(key)와 값(value)의 쌍으로 이루어진 자료구조입니다. 이 글에서는 주어진 파이썬 딕셔너리에서 값이 가장 큰 요소의 키를 찾는 다양한 방법을 알아보겠습니다.max()와 get() 함수 활용하기가장 간단하고 널리 사용되는 방법은 max() 함수에 key=dict.get을 지정하는 것입니다. 이렇게 하면 max 함수가 각 키를 비교할 때 해당 키의 값을 기준으로 삼게 되어, 최대값을 가진 키가 바로 반환됩니다.예제 코드dictA = {Mon: 3, Tue: 11, Wed: 8} print(주어진 딕셔너리:\n
Python 프로그래밍을 하다 보면 리스트 전체가 아니라 마지막 몇 개의 요소만 필요한 경우가 자주 있습니다. 예를 들어 최근 로그 기록이나 가장 최근에 추가된 데이터만 확인할 때 유용하죠. 이번 글에서는 리스트의 마지막 N개 요소를 추출하는 두 가지 대표적인 방법을 소개합니다.1. 슬라이싱(Slicing) 활용하기가장 간단하고 널리 쓰이는 방법은 음수 인덱스를 이용한 슬라이싱입니다. Python에서 인덱스에 음수를 사용하면 리스트의 끝에서부터 역방향으로 접근할 수 있습니다. 추출할 요소의 개수를 n이라고 할 때, listA[-n:
두 개의 리스트가 주어졌을 때, 첫 번째 리스트에서 두 번째 리스트의 요소와 값이 일치하는 항목들의 인덱스를 찾아야 하는 경우가 자주 있습니다. 예를 들어 요일 데이터가 담긴 리스트에서 특정 요일들이 몇 번째 위치에 있는지 확인하는 상황이 대표적입니다.이번 글에서는 이러한 문제를 해결하는 두 가지 대표적인 방법을 소개합니다.1. index() 메서드 활용하기리스트에서 제공하는 index() 메서드를 사용하면 매우 간단하게 해결할 수 있습니다. 리스트 컴프리헨션(list comprehension)을 이용해 두 번째 리스트의 각 요소
Python으로 정수를 영어 단어로 변환하기 주어진 정수를 해당하는 영어 단어 표현으로 바꾸는 것은 대표적인 프로그래밍 연습 문제 중 하나입니다. 숫자의 범위는 0부터 231 − 1까지이며, 예를 들어 입력값이 512라면 출력은 Five Hundred Twelve가 되어야 합니다. 이 문제는 미리 정의된 단어 목록과 재귀 함수를 조합하면 깔끔하게 해결할 수 있습니다. 아래에서 단계별로 살펴보겠습니다. 1. 필요한 단어 목록 준비 less_than_20 : One부터 Nineteen까지, 1~19에 해당하는 영어 단어를 담은 리스
IPv4(Internet Protocol version 4)와 IPv6(Internet Protocol version 6)는 인터넷 프로토콜 스위트에서 네트워크 경계를 넘어 데이터그램을 전달하는 데 사용되는 두 가지 핵심 통신 프로토콜입니다. 이 프로토콜들의 라우팅 기능은 서로 다른 네트워크를 하나로 연결하는 인터네트워킹을 가능하게 하며, 사실상 오늘날 우리가 사용하는 인터넷의 기반을 이루고 있습니다.IPv4는 1980년대 초 표준화된 이후 오랫동안 인터넷의 중추 역할을 해왔지만, 폭발적인 인터넷 사용자 증가로 인해 약 43억 개에
문제 개요배열 nums와 값 val이 주어졌을 때, 배열 내에 존재하는 해당 값의 모든 인스턴스를 제자리(in-place)에서 제거하고 새로운 길이를 반환하는 문제입니다.예를 들어, 입력이 [0,1,5,5,3,0,4,5], 5라면 값 5를 모두 제거한 후 남은 요소의 개수인 5가 출력됩니다.해결 접근 방법이 문제는 투 포인터(Two Pointer) 기법을 활용해 효율적으로 해결할 수 있습니다. 추가적인 배열을 만들지 않고 기존 배열 내에서 값을 덮어쓰는 방식입니다.단계별로 살펴보면 다음과 같습니다.카운터 변수 count를 0으로 초
평면 위에 서로 다른 위치에 있는 n개의 점이 주어졌다고 가정해 봅시다. 이때 부메랑(boomerang)은 세 점으로 이루어진 순서쌍 (i, j, k) 중에서 i와 j 사이의 거리가 i와 k 사이의 거리와 동일한 경우를 말합니다. 즉, 한 점을 기준으로 양쪽에 같은 거리만큼 떨어진 두 점이 있는 V자 형태의 구조입니다. 우리가 구해야 할 것은 이러한 부메랑의 총개수입니다.예를 들어 입력이 [[0,0], [1,0], [2,0]]이라면 출력은 2가 됩니다. 만들어질 수 있는 두 부메랑은 [[1,0],[0,0],[2,0]]과 [[1,0]
고정된 난방 반경을 가진 표준 히터를 설계해서 일직선상의 모든 집을 따뜻하게 해야 하는 상황을 가정해 봅시다. 집들의 위치와 히터들의 위치가 각각 주어졌을 때, 모든 집이 히터의 난방 범위 안에 들어오도록 만드는 히터의 최소 반경을 구하는 것이 이번 글에서 다룰 문제입니다.예를 들어 입력이 [1,2,3,4], [1,4]라고 해 보겠습니다. 히터가 위치 1과 위치 4에 배치되어 있으므로, 반경 1만 확보하면 모든 집을 충분히 데울 수 있습니다. 따라서 기대 출력은 1입니다.풀이 접근 방법핵심 아이디어는 간단합니다. 각 집마다 가장 가
문제 소개하나의 문자열과 정수 k가 주어졌을 때, 문자열의 시작부터 세어 매 2k개의 문자 구간마다 그중 앞의 k개 문자를 뒤집는 것이 이번 문제의 목표입니다. 다만 문자열 끝에 도달했을 때 남은 문자 수에 따라 처리 방식이 달라집니다.남은 문자가 k개보다 적다면 → 남은 문자를 모두 뒤집습니다.남은 문자가 k개 이상 2k개 미만이라면 → 앞의 k개만 뒤집고 나머지는 원래 순서대로 둡니다.예를 들어 입력이 abcdefgh이고 k = 3이라면, 첫 세 글자 abc가 cba로 뒤집히고, 가운데 def는 그대로 유지되며, 마지막에 남은
문제 개요 이진 트리가 하나 주어졌을 때, 전위 순회(preorder traversal) 방식으로 트리를 탐색하며 괄호와 정수로만 구성된 문자열을 생성해야 합니다. 이때 null 노드는 빈 괄호 쌍 “()”으로 표현하지만, 문자열과 원본 이진 트리 사이의 일대일 대응 관계에 영향을 주지 않는 빈 괄호 쌍은 모두 생략해야 합니다. 예를 들어 다음과 같은 트리가 입력으로 주어지면 출력은 5(6()(8))(7)이 됩니다. 결과가 이렇게 나오는 이유를 살펴보겠습니다. 루트 5의 왼쪽 자식은 6, 오른쪽 자식은 7입니다. 노드 6은 오른쪽
야구 게임 점수 기록기가 있다고 가정해 보겠습니다. 문자열 리스트가 하나 주어지며, 각 문자열은 다음 네 가지 유형 중 하나입니다.정수 (한 라운드의 점수) − 해당 라운드에서 얻는 점수를 나타냅니다.+ (한 라운드의 점수) − 해당 라운드의 점수가 최근 두 개의 유효한 라운드 점수의 합임을 의미합니다.D (한 라운드의 점수) − 해당 라운드의 점수가 바로 이전 유효 라운드 점수의 두 배임을 의미합니다.C (연산자, 라운드 점수가 아님) − 직전 유효 라운드의 점수가 무효화되었으며 제거해야
문제 소개직원 정보를 저장하는 데이터 구조가 있다고 가정해 보겠습니다. 각 직원은 고유 ID(id), 중요도 값(importance), 그리고 직속 부하 직원들의 ID 목록으로 구성됩니다.예를 들어, 직원 1이 직원 2의 상사이고, 직원 2가 직원 3의 상사라고 하겠습니다. 세 직원의 중요도가 각각 15, 10, 5라면 데이터 구조는 다음과 같이 표현됩니다.직원 1 → [1, 15, [2]]직원 2 → [2, 10, [3]]직원 3 → [3, 5, []]즉, 회사의 전체 직원 정보와 하나의 직원 ID가 주어졌을 때, 해당 직원 본인
문제 개요데이터 스트림에서 k번째로 큰 요소를 실시간으로 찾는 클래스를 설계해야 한다고 가정해 보겠습니다. 여기서 말하는 k번째로 큰 요소란 정렬된 순서 기준의 k번째 요소를 의미하며, 중복을 제거한 k번째 고유(distinct) 값이 아니라는 점에 유의해야 합니다.KthLargest 클래스는 다음과 같은 구조로 동작합니다.생성자(__init__)는 정수 k와 스트림의 초기 데이터가 담긴 배열 nums를 인자로 받습니다.add(val) 메서드가 호출될 때마다 새로운 값이 스트림에 추가되며, 현재 스트림에서 k번째로 큰 요소를 반환합
이번 글에서는 내장 해시 테이블 라이브러리를 사용하지 않고 해시셋(HashSet) 자료구조를 직접 설계하는 방법을 알아보겠습니다.해시셋의 기본 동작구현해야 할 핵심 함수는 다음과 같습니다.add(x) – 값을 x에 해시셋에 삽입합니다.contains(x) – 값 x가 해시셋에 존재하는지 확인합니다.remove(x) – 해시셋에서 x를 제거합니다. 값이 존재하지 않으면 아무 작업도 수행하지 않습니다.동작 예시해시셋을 초기화한 후 다음 순서로 메서드를 호출한다고 가정해 보겠습니다.add(1), add(3), contains(1), co
해시 테이블은 키-값 쌍을 빠르게 저장하고 조회할 수 있는 자료구조입니다. 이번 글에서는 파이썬의 내장 해시 테이블 라이브러리(예: dict)를 사용하지 않고 해시맵(HashMap)을 처음부터 직접 설계하는 방법을 알아보겠습니다.구현해야 할 기능우리가 만들 해시맵은 다음 세 가지 메서드를 제공해야 합니다.put(key, value) – 키에 해당하는 값을 해시맵에 삽입합니다. 이미 같은 키가 존재하면 값을 새로 갱신(update)합니다.get(key) – 지정한 키에 매핑된 값을 반환합니다. 해당 키가 존재하지 않으면 -1을 반환합
이번 글에서는 특수한 두 종류의 문자를 다루는 문제를 Python으로 해결해 보겠습니다.문제 정의두 가지 특수 문자가 있다고 가정해 봅시다. 첫 번째 문자는 한 개의 비트 0으로 표현되고, 두 번째 문자는 두 개의 비트 10 또는 11로 표현됩니다.여러 개의 비트로 구성된 문자열이 주어졌을 때, 이 문자열을 디코딩했을 경우 마지막 문자가 반드시 1비트 문자인지 확인해야 합니다. 단, 입력으로 주어지는 비트 문자열은 항상 0으로 끝난다는 조건이 있습니다.예시입력이 [1, 0, 0]이라면 출력은 True입니다. 이 배열을 디코딩하는 유
문제 설명 영어 사전을 나타내는 단어 리스트가 주어졌을 때, 리스트의 다른 단어들을 한 글자씩 차례로 이어 붙여 만들 수 있는 가장 긴 단어를 찾는 문제입니다. 만약 답이 여러 개라면 그중 사전순(lexicographical order)으로 가장 앞선 단어를 반환하고, 조건을 만족하는 단어가 없다면 빈 문자열("")을 반환합니다. 예를 들어 입력이 ["h", "he", "hel", "hell", "hello"]라면, 각 단어가