Python 53

[Python] 235MB vs 30MB: 왜 Threading은 1만 개 처리에 실패했나?

0. 들어가기 전에: Python의 GIL과 I/O의 관계본격적인 실험에 앞서, 우리가 반드시 알고 넘어가야 할 Python의 중요한 특성이 있습니다. 바로 GIL (Global Interpreter Lock)입니다.🤔 왜 Python은 하필 GIL을 선택했을까?이것은 Python의 메모리 관리 안전성을 위한 필연적인 선택이었습니다. 1. 참조 카운팅(Reference Counting)과 경쟁 상태(Race Condition) Python(정확히는 CPython)은 객체의 생명주기를 관리하기 위해 참조 카운팅 방식을 사용합니다. 어떤 객체가 몇 번 참조되고 있는지 숫자를 세다가, 0이 되면 메모리에서 해제하는 방식입니다.만약 GIL이 없다면 멀티 스레드 환경에서 치명적인 문제가 발생합니다.시나리오: 스..

Python/core 2025.12.22

[알고리즘/Python] 해시(Hash) vs 정렬(Sort) 성능 비교 : O(N) 최적화 경험 (feat. 완주하지 못한 선수)

1. 문제문제: 프로그래머스 - 완주하지 못한 선수유형: 해시 (Hash)난이도: Level 1목표: 마라톤 참여자 중 완주하지 못한 단 한 명을 찾아내야 한다. (동명이인 존재 가능)2. 첫 번째 접근 : 정렬(Sorting) 활용처음에는 가장 직관적인 방법으로 접근했다. 두 리스트를 모두 정렬한 뒤, 순서대로 비교하다가 달라지는 부분이 있다면 그 사람이 완주하지 못한 사람이다.def solution(participant, completion): # 1. 두 리스트를 정렬 (O(N log N)) participant.sort() completion.sort() # 2. zip으로 묶어서 순서대로 비교 for p, c in zip(participant, completion): ..

Python/algorithm 2025.12.12

asyncio를 pip install 한 대가

오늘은 서비스 배포중 발생한 굉장히 있으면 안될 이슈에 대해 작성해보고자한다. 문제상황빌드가 잘되던 도커에서 pip 가 requirements.txt 설치하는 과정에서 문제가 발생한 것이다.#11 68.49 Traceback (most recent call last):#11 68.49 File "/usr/local/lib/python3.9/py_compile.py", line 144, in compile#11 68.49 code = loader.source_to_code(source_bytes, dfile or file,#11 68.49 File "", line 913, in source_to_code#11 68.49 File "", line 228, in _call_with_frame..

Python 2025.04.29

프로그래머스 신규 아이디 추천

📝 TIL - 프로그래머스 신규 아이디 추천 📌 문제 요약 사용자로부터 입력된 아이디가 조건에 맞지 않을 경우, 주어진 규칙에 따라 새로운 아이디를 추천하는 문제입니다. 📚 학습 내용 정규표현식을 활용한 문자열 정제 조건문과 슬라이스를 활용한 문자열 길이 조정 문자열의 시작/끝에서 특정 문자 제거 (마침표) 로직을 함수로 분리하여 재사용성 및 가독성 향상 🔧 주요 로직 요약 모든 대문자를 소문자로 변환 허용되지 않은 문자 제거 연속된 마침표는 하나로 축약 시작/끝에 위치한 마침표 제거 빈 문자열이면 "a"로 대체 길이가 16자 이상이면 자르고, 끝이 마침표면 제거 길이가 2자 이하이면 마지막 문자를 반복하여 길..

Python/algorithm 2025.04.21

N초 동안 가능한 스킬 조합 수 구하기

🧠 TIL - DP로 N초 동안 가능한 스킬 조합 수 구하기 오늘은 스킬의 사용 시간 제약이 있는 조합 문제를 DP로 해결해봤다. 핵심은 dp[i]가 “i초를 채우는 방법의 수”를 의미한다는 점이다. 📌 문제 요약 스킬 A: 1초 스킬 B: m초 총 N초를 정확히 채울 수 있는 모든 조합의 수를 구하라 결과는 1,000,000,007로 나눈 나머지 출력 📄 핵심 점화식 dp[i] = dp[i - 1] + dp[i - m] (단, i ≥ m) 🔍 코드 설명 nanoom = 1_000_000_007dp = [0] * (n + 1)dp[0] = 1 # 0초는 아무 것도 안 쓰는 1가지 방법for i in range(1, n + 1): dp..

Python/algorithm 2025.04.20

JadenCase 문자열 처리[프로그래머스]

🧠 TIL - JadenCase 문자열 처리 오늘은 문자열을 JadenCase로 바꾸는 문제를 풀었다. 핵심은 단어별로 첫 글자는 대문자, 나머지는 소문자로 만드는 거고, 숫자로 시작하는 경우는 소문자만 처리하면 된다. 📌 예시 input : "3people unFollowed me"output: "3people Unfollowed Me" 💡 핵심 로직 def solution(s): answer = '' for i in s.split(" "): if i == "": answer += " " elif i[0].isalpha(): answer += i[0].upper() + i[1:].lower..

Python/algorithm 2025.04.16

과자 나눠주기 [백준]

🧠 TIL - 이진탐색 과자 나눠주기 오늘은 다시 한 번 이진탐색 개념을 정리했다. 직접 구현할 땐 while문 범위나 mid 조정에서 종종 헷갈려서, 이번에 완전히 패턴을 잡아놔야겠다고 생각했다. 📌 개념 이진 탐색은 정렬된 탐색 범위 내에서 특정 조건을 만족하는 값을 찾는 방식이다. 중간값(mid)을 기준으로 탐색 범위를 반씩 줄여가며, 조건을 만족하는지 확인하고 범위를 조정한다. 🧩 기본 구조 start = 최소값end = 최대값answer = 0while start ❓ 왜 이렇게 하는가 start : 탐색이 끝나기 전까지 조건을 만족: 일단 저장하고 더 큰 쪽 탐색 조건 불만족: 무조건 줄여야 하니까 end 감소 ..

Python/algorithm 2025.04.14

백준 병든 나이트

링크: https://www.acmicpc.net/problem/1783📌 문제 요약나이트가 체스판 위에서 이동할 수 있는데, 병들어서 **2가지 방향으로만 이동 가능**함.단, 방문 횟수에 따라 **움직일 수 있는 방향 제약 조건**이 있음.나이트는 총 4가지 방식으로 이동 가능 (실제론 2가지)세로로는 위로만 이동함총 이동 횟수에 따라 4가지 이동 방식 중 적어도 3가지 이상을 사용해야 제약이 풀림📌 분기높이 H가 1 → 움직일 수 없음 (정답: 1)H가 2 → 위로 2칸 못 가니까 최대 4번까지만 가능 (이동 방식 제한)H ≥ 3 and W 그 외에는 자유롭게 이동 가능 → W - 2칸까지 가능💻 코드n,m = map(int, input().split())def solution(n, m): ..

Python/algorithm 2025.04.13

[OpenAI Agent] 편지 작성 에이전트 ( 멀티 에이전트 )

프로젝트에 있는 코어 기능 중 하나인 편지 작성 기능은 처음에 단일 에이전트를 사용하고 있었고,편지 내용이 약간 어색한 부분이 있는 듯하여 고도화가 필요해 보였습니다 여기서 저는 Multi Agent구조를 통해 이를 개선 할 수 있지 않을까 라는 생각을 했습니다.왜 편지 작성에 멀티 에이전트를 사용했는가? 1  . 언어별 표현 방식과 문화 차이 대응 위에서 말한 어색한 편지 내용은 한국어,영어,일본어 등 언어별로 표현하는 방법이나 문화, 뉘앙스가 달라서 각 언어별로 다릅니다.때문에 각 언어별 지시사항을 가진 Agent들을 handoffs 로 두고  Letter Agent가 전달받은 Language 값에 따라 각 언어별 에이전트에 편지 작성을 위임하게 했습니다.class KoreanLanguageAgent..

측정할 수 없는 최소 무게

오늘은 그리디(Greedy) 알고리즘의 핵심 개념을 활용하는 문제인 백준 2437번: 저울을 풀어보았다. 🧩 문제 요약 여러 개의 저울추가 주어진다. 이 추들을 이용해 측정할 수 없는 가장 작은 양의 정수 무게를 구하는 문제다. 예: [3, 1, 6, 2, 7, 30, 1] → 정답: 21 🔍 핵심 아이디어 추들을 오름차순 정렬한 후, 지금까지 만들 수 있는 최대 누적합을 `target`이라 한다. 매번 다음 추의 무게 `w`를 확인하며, w > target일 경우, 그 순간 target이 측정할 수 없는 최소 무게가 된다. 🤔 왜 그렇게 되는가? 예를 들어, 현재까지 1 ~ 20까지는 만들 수 있었다고 하자. 그런..

Python/algorithm 2025.04.10