분류 전체보기 143

[23.11.23] 그저 다 포기하고 싶을 땐 어떡해야할까

언젠가부터 인생이 살살 꼬이기 시작했다. 나 스스로 꼬은 거긴 하지만, 아무튼 꼬였다. 단단히 꼬인 매듭들을 하나씩 풀기 위해서 인생에 여러 가지 변화를 주기 시작했다. 프세 활동도 시작하고, 점심시간에 운동도 하고, 예쁜 옷들을 사 입고, 독일어 공부도 다시 시작하고, 혼자서 여러 가지 컨텐츠를 기획하고 실천하며 삶을 굉장히 알차고 즐겁게 보내고 있는데 이상하게 가슴속 공허함은 더 커져만 간다. 뭐가 문제인지 모르겠다. 근본적인 우울함과 무기력함의 원인이 해소되지 않아서 그런가. 여러 활동들을 하면서 스트레스가 해소되기는커녕 오히려 힘만 더 부치는 느낌이다. 요새 이어폰을 끼고 무언가를 듣고 있지 않으면 미칠 것 같다. I don't want to be left alone with my own thou..

Lifelog 2023.11.24

1. Stay hungry. Stay foolish.

입사 1주년. 지난 일 년간의 경험으로 난 무엇을 배우고 성취했을까? 난 무엇을 위해 꾸역꾸역 버티며 지냈을까? 나는 과연 성장을 했을까? 확실한 건 나만의 기술력과 경쟁력을 잘 키우지는 못 했다. 하지만 그럼에도 불구하고 배운 건 많다. IT 기술인으로서의 성장은 미미했지만, 여러 경로를 통해 '삶의 태도'를 배울 수 있었다. 앞으로 내가 삶을 살아감에 있어서 큰 양분이 되어줄 세 가지 깨달음을 기록해보고자 한다. 1. 운동은 시간이 남아서 하는 것이 아닌, 시간을 투자해서 해야만 하는 것. 무슨 일을 하든 체력이 뒷받침되어야 하는데, 먹고 가만히 앉아있기만 하면 몸 무거워지고 각종 병 도지는 건 순식간. 체력이 떨어지니 업무 집중력도 함께 떨어져서, 쉽게 할 수 있는 일이 힘에 부쳤고 결국 업무 생산..

[23.08.01] “신입 같은 경력”

“아, 그 신입 같은 경력? ㅋㅋ” 비웃음과 멸시가 함축된 묵직한 한마디. 듣는 순간 온몸에 소름이 오소소... 그 어떤 쌍욕보다도 치욕스럽고 무서웠다. 아, 물론 내가 들은 욕은 아니었고 타 팀 사람들이 제3자 욕하는 걸 엿들었을 뿐. 그리고 난 아직까지 응애 신입이기에 해당사항 없다 ㅎㅎ 하지만 언제까지고 신입일 수는 없는 노릇. 문득 두려워진다. 자칫 방심하면 남 얘기가 아니게 될까 봐. 그래서 공부하기로 결심했다. 멍청해지지 않기 위해 욕먹지 않기 위해 나의 가치를 높이기 위해 더 나은 미래를 위해

Lifelog 2023.08.02

[23.06.13] 그저 버텨내는 삶

매일매일, 의미 없고 하기 싫은 일을 억지로 한 후 괴로움에 눈물을 흘리며 잠들기를 반복한다. 그리고 아무런 유의미한 노력 없이, 잠자고 일어나면 유토피아가 눈앞에 펼쳐지기를 바라기만 할 뿐. 인생의 3분의 1이 수면, 나머지 3분의 2 깨어있는 동안 괴로운 일을 하며 살아가는 게, 과연 살아가는 것인가? 그저 버텨내는 것인가? "살아있음"을 느끼고 싶다.

Lifelog 2023.06.14

[취준일기] Bridge Software Engineer가 되었다

입사한 지 만 5개월이나 지난 시점에서 쓴다. ^^ 취준일기를 마지막으로 쓴 시점 이후로도 계속해서 기업 면접들을 봤지만, 대부분 인연이 안 닿았다. 너무 합격하고 싶었고, 꼭 합격할 것만 같았던 곳에서 갑자기 해당 포지션이 hold 되었다는 통보를 받은 적도 있었고. 또 면접 과정 자체가 너무 성의 없고 뭔가 쎄해서 1차 합격했음에도 불구하고 2차 면접에 불참하겠다고 한 적도 있었고... 참 다사다난했고, 너무나도 심란하고 괴로웠던 시기였다. 그때의 나에게서는 일말의 자존감도 희망도 찾아볼 수 없었다. 그러다 어느 날 링크드인으로 날아온 연락 하나... Bridge Software Engineer 포지션에 대한 JD를 보내주며, 이런 일 해보는 건 어떻겠냐는 제안이 들어왔다. 연락 오는 헤드헌터/리크루..

Lifelog 2023.01.24

[알고리즘] 벨먼-포드 알고리즘

✅ 벨먼-포드 알고리즘 (Bellman-Ford Algorithm) ❕ 기본 개념 - 그래프의 최단 경로 문제를 해결하기 위한 알고리즘 - 최단 경로 문제에서는 간선에 가중치가 부여된 가중 그래프가 주어지며, 시작점부터 종점까지의 경로 중 간선의 가중치 최소합을 구하면 됨 - 가중치가 음수라도 제대로 동작함 - 방향성/비방향성 그래프 모두 적용 가능 - 정점 수를 n, 간선 수를 m이라고 할 때, 가중치 변경 작업을 n회 순회하고, 각 변경 작업에서 각 간선을 1회씩 조사하므로 전체 계산 시간은 O(nm) ❕ 작동 방식 ✔ 구현 방법 (JS) function BellmanFord(graph, V, E, src) { // Initialize distance of all vertices as infinite..

[알고리즘] 이진 탐색

✅ 이진 탐색 (Binary Search) ❕ 기본 개념 - 배열에서 데이터를 탐색하는 알고리즘 - 선형 탐색과 달리, 데이터가 정렬된 경우에만 적용할 수 있음 - 배열의 가운데에 있는 데이터와 대상 데이터를 비교해서 대상 데이터가 정중앙보다 오른쪽에 있는지, 왼쪽에 있는지 확인 - 비교 작업을 대상 데이터를 찾거나 존재하지 않는다는 것을 확인할 때까지 반복 - 탐색 범위를 매번 반씩 줄여나갈 수 있는 탐색 알고리즘 - n개의 데이터를 반으로 나누는 작업을 log2n회 반복 = 계산 시간은 O(log n) ❕ 작동 방식 ✔ 구현 방법 (JS) function binarySearch(sortedArray, key) { let start = 0; let end = sortedArray.length - 1; ..

[알고리즘] Greedy Algorithm

✅ 욕심쟁이 알고리즘 (Greedy Algorithm) ❕ 기본 개념 - 매 선택마다 현재 시점에서 최적의 답을 선택하여 적합한 결과를 도출하는 알고리즘 설계 기법 - 하지만 그 최적의 답이 최종적인 결과 도출에 대한 최적해를 보장해주지는 않음 - 동적 프로그래밍을 간단한 문제 해결에 사용하면 지나치게 많은 일을 한다는 점을 착안하여 고안됨 해당 알고리즘이 필요한 문제의 조건은 아래와 같다. 1. 최적 부분 구조 : 부분 문제들의 최적의 답을 이용해서 전체 문제의 최적해를 구할 수 있다. 2. 탐욕적 선택 속성 : 각 단계에서 탐욕스러운 선택을 하는게 전체 문제를 푸는 데 있어서 최선의 선택을 하는 것이라면, 그 문제는 탐욕적 선택 속성을 가지고 있는 것이다. ❕ 작동 방식 ✔ 활용 예시 - AI 결정 ..

[알고리즘] Dynamic Programming

✅ 동적계획법 (Dynamic Programming) ❕ 기본 개념 - 복잡한 문제를 간단한 여러 개의 문제로 나누어 푸는 방법 - 일반적인 재귀 방식과 매우 유사하지만, 작은 문제들이 여러번 반복되는 비효율적인 계산을 피할 수 있음 해당 알고리즘이 필요한 문제의 조건은 아래와 같다. 1. 겹치는 부분 문제 (Overlapping Subproblems) : DP는 문제를 작은 문제들로 나누고 그 결과값들을 재활용해서 전체 답을 구한다. 따라서 동일한 부분 문제들이 반복하여 나타나고, 부분 문제가 중복되는 경우에 사용 가능하다. 2. 최적 부분 구조 (Optimal Substructure) : 부분 문제의 최적 결과 값을 사용해 전체 문제의 최적해를 낼 수 있는 경우를 의미한다. ❕ 작동 방식 DP를 통해..

[알고리즘] 계수 정렬

✅ 계수 정렬 (Counting Sort) ❕ 기본 개념 - 말 그대로 각 요소의 갯수를 세어서 저장해두고, 그에 따라 적절한 위치에 정렬하는 알고리즘 - 값의 범위가 너무 크면 안 되고, 각 항목의 갯수를 기록하기 위해 정수로 인덱스 되는 카운트 리스트를 사용하기 때문에 정수나 정수로 표현할 수 있는 자료에만 적용할 수 있다는 한계가 존재함 - 비교 정렬 알고리즘의 최소 시간복잡도가 O(n logn)인데에 비해 계수 정렬은 평균 O(n)의 시간복잡도를 가짐 - 다만 공간복잡도가 O(size)이기 때문에 메모리 낭비가 심함 ❕ 작동 방식 ✔ 구현 방법 (JS) const arr = [4, 3, 1, 2, 3]; const findMaximum = (arr) => arr.reduce((acc, val) =..

[알고리즘] 퀵 정렬

✅ 퀵 정렬 (Quick Sort) ❕ 기본 개념 - 분할 정복(divide and conquer) 방법을 통해 정렬 - 수열 안에서 기준이 되는 수인 피봇(pivot)을 임의로 하나 선택한 후, 나머지 수를 '피봇보다 작은 수'와 '피봇보다 큰 수'의 두 그룹으로 나눈다. 피봇을 기준으로 왼쪽과 오른쪽의 리스트들을 각각 정렬하면 전체 정렬이 완료됨 - 분할된 두 개의 리스트에 대해 재귀적으로 앞의 과정을 반복한다. (재귀는 리스트의 크기가 0 또는 1이 될 때까지 반복) - n의 리스트를 정렬하는데 걸리는 시간을 T(n), c는 임의의 상수라 하고, 리스트가 피봇 기준으로 두개의 비슷한 크기의 부분집합으로 나뉜다는 가정 하에 얻는 평균 시간복잡도는 O(n logn)이다. - 반면, 운이 나빠 매번 최솟..

[알고리즘] 삽입 정렬

✅ 삽입 정렬 (Insertion Sort) ❕ 기본 개념 - 자료 배열의 모든 요소를 차례대로 정렬 완료된 부분과 비교하여 자신의 위치를 찾아 삽입함으로써 정렬을 완성하는 알고리즘 - 배열이 길어질수록 효율이 떨어지지만 구현이 간단함 - 숫자 비교 횟수는 최악의 경우에 1 + 2 + 3 + ... + (n - 1) ≈ n2 / 2 번 비교 - 따라서 시간복잡도는 O(n2), 공간복잡도는 O(1) ☜ 추가적인 메모리 필요 X ❕ 작동 방식 ✔ 구현 방법 (JS) function insertionSort(inputArr) { let n = inputArr.length; for (let i = 1; i < n; i++) { // Choosing the first element in our unsorted s..

[알고리즘] 선택 정렬

✅ 선택 정렬 (Selection Sort) ❕ 기본 개념 - 수열 중에서 최솟값을 검색한 후 왼쪽 끝 숫자와 교체하는 작업을 반복하며 정렬 - 최솟값을 찾을 때는 선형 탐색을 사용 - 숫자 비교 횟수는 (n - 1) + (n - 2) + ... + 1 ≈ n2 / 2, 숫자 교체는 각 라운드 당 최대 1회 - 따라서 선택 정렬 시간 복잡도는 O(n2) ❕ 작동 방식 ✔ 구현 방법 (JS) function selectionSort(inputArr) { let n = inputArr.length; for (let i = 0; i < n; i++) { // Finding the smallest number in the subarray let min = i; for (let j = i + 1; j < n; j..

[알고리즘] BFS & DFS

✅ 너비 우선 탐색 (BFS, Breadth-First Search) ❕ 기본 개념 - 그래프의 시작점에서 간선(edge)을 따라가며 정점(node)을 탐색하고 지정한 목표 정점에 도달하는 것 - BFS는 그래프의 시작점부터 가까운 순으로 너비를 넓혀 가며 탐색하는 알고리즘 - 따라서 목표가 시작점에 가까이 있으면 탐색이 빨리 종료됨 - 후보 노드를 선입선출(FIFO) 구조로 관리하므로 queue 데이터 구조를 사용 - 따라서 queue와 while loop을 이용하여 BFS를 구현함 ❕ 작동 방식 ✔ 활용 예시 queue의 특징이 필요한 부분이나 너비를 우선으로 탐색하는 것이 효율적인 곳에 사용됨 ex. 최단거리를 구하는 문제 ☞ BFS로 가까운 노드부터 탐색하기 때문에, 가장 먼저 찾아지는 해답이 곧..

[알고리즘] 완전탐색기법

✅ 완전탐색 알고리즘 (Brute Force Algorithm) ❕ 기본 개념 - 가능한 모든 경우를 모두 확인하여 정답을 찾아내는 방식 - 운이 좋다면 빠르게 답을 도출할 수 있지만, 운이 나쁘면 가장 마지막으로 확인하는 경우가 답이 될 수도 있음 - 따라서 효율적인 문제 해결에는 적합하지 않은 탐색 알고리즘임 ❕ 완전탐색 기법 Brute Force 기법 : 반복 / 조건문을 활용하여 모든 가능한 경우를 전부 다 확인 Permutation (순열) : 서로 다른 n개의 원소 중 r개를 선택하여 나열 (순서 상관 O, 중복 허용 X) Recursive (재귀 호출) Bitmasking (비트마스크) : 2진수 표현 기법 활용 BFS, DFS ❓ Brute Force 기법 - 반복 / 조건문을 통해 가능한..

반응형