
✅ 성능 튜닝궁극적으로 1초 이상 걸리는 트랜잭션을 찾아 개선하는 것 (APM, Jmeter, 모니터링 도구 등 이용)* 서버가 좋아지는 것?- 사용자의 입장 : 빨리 응답이 오는 경우 => Real User Monitoring- 개발자의 입장 : 똑같은 트래픽을 얼마나 적은 자원으로 견뎌내는 것 => APM* 목적- 시스템의 병목 지점을 찾는 것* 정의- 비 기능 테스트 : 응답성 및 안정성 측면* 종류- 부하 / 용량 산정 테스팅- 스트레스 테스팅 : 서버가 죽을 때 까지 부하를 올려 테스트- 내구성 테스트 : 긴 시간 부하를 주어서 얼마나 견디는지 확인하는 테스트- 최고점 부하 테스트 : 견딜 수 없을 만큼의 부하를 주어 회복 탄력성을 확인하는 테스트* 관련 데이터- 테스트 케이스- 진단 결과- 테..

✅ 오늘의 학습 키워드함수 호출 스택 ✅ 오늘의 학습 이유오늘의 코딩 테스트 문제는 중위 순회(In-order Traversal)였습니다. 중위 순회는 이진 트리의 노드를 왼쪽 자식 -> 루트 -> 오른쪽 자식 순서로 방문하는 방식입니다. 이를 구현하기 위해 재귀적으로 중위 순회를 수행하는 함수를 작성했습니다. 이 과정에서 함수 호출 스택에 대한 정확한 지식이 있으면 문제를 간단하게 풀 수 있었기 때문에, 학습의 중요성을 느꼈습니다. - 함수 호출 스택이란?함수 호출 스택은 프로그램 실행 중에 함수 호출을 추적하고 관리하는 메모리 구조입니다. 함수가 호출될 때마다 스택의 가장 위에 새로운 프레임이 추가되며, 함수가 반환되면 해당 프레임이 스택에서 제거됩니다. 이를 통해 프로그램은 각 함수 호출의 실행 상..

✅ 오늘의 학습 키워드최소직사각형완전탐색 ✅ Python Code- 문제명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.아래 표는 4가지 명함의 가로 길이와 세로 길이를 나타냅니다.명함 번호가로 길이세로 길이16050230703603048040가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함..

✅ 오늘의 학습 키워드모의고사완전탐색 ✅ Python Code- 문제수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 ..

✅ 오늘의 학습 키워드Symmetric Tree ✅ Symmetric Tree- 문제Given the root of a binary tree, check whether it is a mirror of itself (i.e., symmetric around its center). - 풀이from typing import Optionalclass TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = rightclass Solution: def isSymmetric(self, root: TreeNode) -> bool: ..

✅ 오늘의 학습 키워드Search in a Binary Search Tree ✅ Search in a Binary Search Tree- 이진 트리이진트리는 각 노드가 최대 두 개의 자식을 가지는 트리 구조입니다. * 이진 트리를 사용하는 이유1. 효율적인 검색, 삽입, 삭제 - 이진 탐색 트리를 사용하면 데이터의 정렬된 상태를 유지하면서 평균적으로 O(log n) 시간 안에 원하는 데이터를 검색, 삽입, 삭제할 수 있습니다. - 이는 데이터의 수가 많아질수록 효율적인 접근을 가능하게 합니다.2. 정렬된 데이터 유지 - 이진 탐색 트리의 경우 중위 순회를 통해 모든 노드를 정렬된 순서로 방문할 수 있습니다. 이는 정렬된 데이터의 출력을 쉽게 해줍니다.3. 메모리 사용의 최적화 - 이진 트리는 노드..

✅ 오늘의 학습 키워드문자열 내림차순으로 배치하기정렬 ✅ 문자열 내림차순으로 배치하기- 문제문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.* 제한 조건str은 길이 1 이상인 문자열입니다. - 풀이def solution(s): return "".join(sorted(s, reverse=True)) - 생각오늘의 키워드는 '정렬'입니다. 문자열은 이미 순서가 있는 데이터 타입이므로, 'sorted()' 함수를 사용했습니다. 내림차순으로 정렬하기 위해 'reverse=True' 옵션을 적용했는데, 우려했던 "대문자는 소문자보다 작은 것으로 간주합니..

✅ 오늘의 학습 키워드정수 내림차순으로 배치하기 정렬 ✅ 정수 내림차순으로 배치하기- 문제함수 solution은 정수 n을 매개변수로 입력받습니다.n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요.예를들어 n이 118372면 873211을 리턴하면 됩니다.* 제한 조건n은 1이상 8000000000 이하인 자연수입니다. - 풀이def solution(n): original_list = list(str(n)) # 입력받은 n을 문자열로 변환한 후, 각 문자를 리스트에 담는다. original_list.sort(reverse=True) # 내림차순으로 정렬한다. sorted_list = "".join(original_list) # 리스트를 하나의 문자열로 합친다. ..

✅ 오늘의 학습 키워드[leetcode] Kth Largest Element in a Stream ✅ Kth Largest Element in a Stream- 문제 - 1차 풀이from typing import Listimport heapqclass KthLargest: def __init__(self, k: int, nums: List[int]): self.k = k self.nums = nums heapq.heapify(self.nums) # 리스트를 최소 힙으로 변환합니다. self.nums = heapq.nlargest(self.k, self.nums) # 가장 큰 k개의 요소만 남기고, 내림차순으로 정렬합니다. def add(self..

✅ 오늘의 학습 키워드[leetcode] Relative Ranksheapq ✅ Relative Ranks- 문제 - 풀이from typing import Listclass Solution: def findRelativeRanks(self, score: List[int]) -> List[str]: ranking = [(s, index) for index, s in enumerate(score)] sorted_ranking = sorted(ranking, key=lambda x: x[0], reverse=True) result = [""] * len(score) def converted_medal(rank, index): meda..

✅ 오늘의 학습 키워드올바른 괄호 ✅ 올바른 괄호- 문제 - 풀이def solution(s: str): opens = 0 for char in s: if char == "(": opens += 1 else: if opens == 0: return False opens -= 1 return opens == 0 - 생각문제는 괄호가 정확히 열리고 닫혔는지를 확인하는 방법이었습니다. 처음에 '정규식으로 할 수 있을까?' 생각했지만, 반복적으로 일어나는 현상이므로 결국 for문을 활용할 수 밖에 없겠다고 판단했습니다. 괄호는 열어야지만 닫을 수 있으므로 opens == 0인데 문자열이 ..

✅ 오늘의 학습 키워드슬라이스[:]arr[start:stop:step]start : 시작 인덱스stop : 끝 인덱스step : 생성할 때의 간격 ✅ Python Codearr = [1, 2, 3, 4, 5]# 모든 요소를 선택print(arr[:]) # [1, 2, 3, 4, 5]# 처음 두 요소를 선택print(arr[:2]) # [1, 2]# 마지막 두 요소를 선택print(arr[-2:] # [4, 5]# 두 번째 요소부터 끝까지 선택print(arr[1:]) # [2, 3, 4, 5]# 모든 요소를 거꾸로 선택print(arr[::-1]) # [5, 4, 3, 2, 1] ✅ 응용- 리스트 중간 부분 변경arr = [1, 2, 3, 4, 5]arr[1:4] = [9, 8, 7]print(arr) ..