전체 글140 [Operating System & Concurrency] 프로세서, 프로세스, 스레드, 코루틴의 개념과 관계 정리 운영체제를 공부하면서 여러 번 관계성을 정리하려 했지만, 학습할 때마다 다시 헷갈리는 반복이 이어졌습니다. 흐름을 제대로 정리하고자 여러 유튜브 강의를 찾아보던 중, 유튜버 얄팍한 코딩사전님의 "프로세스는 뭐고 스레드는 뭔가요?" 영상을 보고 개념을 정리하는 데 많은 도움을 받았습니다. 이 글은 해당 영상에서 설명된 내용을 바탕으로 나중에 다시 참고하기 위해 정리한 글입니다.또한, 프로세서, 프로세스, 스레드의 관계를 이해한 후, 처음에는 스레드와 비슷하게 보였던 코루틴의 개념까지 정리하고 싶어 관련 블로그 글을 찾아 읽었습니다. 이 과정에서 발견한 글을 통해 스레드와 코루틴의 차이를 이해하는 데 큰 도움이 되었으며, 이를 바탕으로 최종적으로 본 글을 정리하게 되었습니다.혹시라도 이 글을 보게 된 분이라.. 2025. 3. 6. [Algorithm/Kotlin] 백준 2630번 색종이 만들기: 분할정복을 활용한 풀이법 1. 문제 설명주어진 N × N 크기의 색종이가 하얀색(0)과 파란색(1) 으로 칠해져 있을 때,이를 모두 같은 색이 될 때까지 잘라 각 색상의 개수를 구하는 문제입니다.문제 조건N은 2^k (k = 1~7) 형태로 주어집니다. (즉, 2, 4, 8, 16, 32, 64, 128 중 하나)색종이가 한 가지 색으로만 칠해져 있다면, 더 이상 자르지 않고 해당 색종이 개수를 증가시킵니다.혼합된 색상이 있다면, 정사각형을 4등분하여 동일한 방식으로 재귀적으로 처리합니다.예제 입력81 1 0 0 0 0 1 11 1 0 0 0 0 1 10 0 0 0 1 1 0 00 0 0 0 1 1 0 01 0 0 0 1 1 1 10 1 0 0 1 1 1 10 0 1 1 1 1 1 10 0 1 1 1 1 1 1예제 출력97 즉,.. 2025. 3. 4. [Algorithm/Kotlin] 백준 1260번 DFS와 BFS: 탐색 알고리즘 구현 및 원리 1. 문제 설명주어진 그래프에서 DFS와 BFS 탐색을 수행한 결과를 출력하는 문제입니다.방문할 수 있는 정점이 여러 개인 경우, 번호가 작은 정점부터 우선 방문해야 합니다.입력첫 번째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점 V가 주어집니다.이후 M개의 줄에는 양방향 간선이 연결하는 두 정점의 번호가 주어집니다.출력첫 번째 줄: DFS 탐색 결과두 번째 줄: BFS 탐색 결과정점 방문 순서대로 출력합니다.2. 문제 해결 아이디어DFS (Depth-First Search, 깊이 우선 탐색)스택(Stack) 또는 재귀(Recursion)를 이용해 탐색을 수행합니다.현재 정점에서 가능한 한 깊이 들어가며 방문한 후, 더 이상 갈 곳이.. 2025. 2. 27. [DataStructure/Graph] 완전 탐색 문제를 해결하는 두 가지 방법: 인접 행렬 vs 인접 리스트 완전 탐색 문제를 풀면서 완전 탐색을 구현하는 방식에는 두 가지 방법(인접 행렬과 인접 리스트)이 있다는 것을 알게 되었습니다.각 방식이 어떤 경우에 유리하게 활용되는지 문제를 통해 정리해 두면 좋을 것 같아 이번 글을 작성하게 되었습니다.이번 글에서는 완전 탐색을 인접 행렬과 인접 리스트를 사용하여 해결할 때의 차이점과 각각의 장단점을 두 가지 문제를 예제로 설명하겠습니다.1. 인접 행렬을 사용하는 경우1.1 인접 행렬(Adjacency Matrix) 개념배열(Array) 기반이며, BooleanArray를 사용하여 간선 유무를 표현합니다.graph[i][j] = true이면 i번 노드와 j번 노드가 연결된 것입니다.graph[i][j] = false이면 연결되지 않은 상태입니다.공간 복잡도: O(N^.. 2025. 2. 27. [Operating System] 프로세서, 코어, 프로세스, 스레드를 쉽게 이해하기: 공장 비유로 살펴보기 처음에는 프로세스와 스레드의 관계를 이해한 것 같았지만, 프로세서 개념까지 생각하니 혼란이 생기기 시작했습니다. 이를 해결하기 위해 전체적인 개념을 비유를 통해 정리해보았습니다. 이 글은 프로세서, 코어, 프로세스, 스레드의 관계를 공장에 비유하여 쉽게 이해할 수 있도록 설명하는 데 중점을 두었습니다.프로세서, 프로세스, 스레드의 개념을 "공장"에 비유해서 설명해보겠습니다.프로세서(Processor)는 공장 전체입니다. 공장에는 여러 기계(코어)가 있어 작업을 처리합니다.코어(Core)는 공장 내의 개별 기계입니다. 실제로 제품을 만드는 일을 합니다.프로세스(Process)는 공장의 생산 라인입니다. 각 생산 라인은 독립적으로 운영됩니다.스레드(Thread)는 생산 라인에서 일하는 작업자입니다. 실제로 .. 2025. 2. 26. [Android/Compose] Jetpack Compose를 통해 살펴보는 선언형 UI와 명령형 UI의 차이 Jetpack Compose를 공부하면서 "선언형 UI"라는 단어를 자주 접하게 되었습니다.Compose의 가장 큰 장점으로 꼽히는 선언형 UI가 기존의 명령형 UI와 어떤 차이가 있는지,그리고 왜 선언형 UI가 더 효율적인지에 대한 궁금증이 생겼습니다.이 글에서는 명령형 UI와 선언형 UI의 차이점,그리고 Jetpack Compose가 제공하는 선언형 UI의 장점에 대해 정리해보겠습니다.1. 명령형 UI와 선언형 UI란?UI를 구성하는 방법에는 크게 명령형 UI(Imperative UI)와 선언형 UI(Declarative UI) 두 가지 접근법이 있습니다.이 두 방식은 상태 관리와 UI 업데이트 방법에서 근본적인 차이를 보입니다.명령형 UI → 어떻게 그릴지를 개발자가 직접 명령선언형 UI → 무엇을.. 2025. 2. 25. [Android/Kotlin] lateinit 이해하기: nullable과의 차이와 지연 초기화 이해하기 개발을 하다 보면, 변수를 선언할 때 초기값을 바로 할당하지 못하는 경우가 많습니다. lateinit 키워드를 자주 사용했지만, 왜 굳이 nullable 대신 lateinit을 써야 하는지 깊이 고민해보지 않았습니다.이번에 공부하면서 lateinit의 필요성과 nullable과의 차이점을 명확히 이해하게 되었고,그 내용을 정리해보았습니다. 1. lateinit 키워드의 의미와 사용 이유lateinit은 Kotlin에서 변수를 나중에 초기화할 것임을 명시하는 키워드입니다.이를 통해 초기화 시점을 유연하게 조정할 수 있습니다.Kotlin은 Null Safety를 보장하기 위해 변수를 선언할 때 반드시 초기화를 요구하지만,초기값을 바로 설정할 수 없는 경우에는 lateinit 키워드를 사용할 수 있습니다.예시.. 2025. 2. 25. [Android] Activity 생명주기 정리 Activity 생명주기(Activity Lifecycle)는 앱이 시작되고 종료될 때, 포커스를 얻거나 잃을 때, 백그라운드로 전환될 때 등 다양한 상황에서 호출되는 메서드들의 흐름을 의미합니다. 이를 이해하면 앱의 상태를 올바르게 관리할 수 있으며, 자원 누수나 비정상적인 동작을 방지할 수 있습니다.1. Activity 생명주기 콜백 메서드메서드설명onCreate()Activity가 처음 생성될 때 호출됩니다. 초기화 작업(뷰 세팅, 데이터 바인딩 등)을 여기서 합니다.onStart()Activity가 사용자에게 보이기 직전에 호출됩니다. (하지만 아직 포커스는 없음)onResume()Activity가 포그라운드에 있으며 사용자와 상호작용 가능한 상태일 때 호출됩니다.onPause()다른 Activi.. 2025. 2. 24. [Algorithm/Kotlin] 백준 17626번 Four Squares: DP를 활용한 풀이법 문제 설명1770년, 라그랑주는 모든 자연수는 네 개 혹은 그 이하의 제곱수 합으로 표현할 수 있다는 사실을 증명했습니다. 목표:주어진 자연수 n을 최소 개수의 제곱수 합으로 표현하세요.입력:자연수 n (1 ≤ n ≤ 50,000)출력:n을 표현할 수 있는 제곱수의 최소 개수문제 해결 아이디어 1. 접근 방법처음에는 가장 큰 제곱수를 빼주면 되지 않을까? 하는 생각으로 그리디(Greedy) 접근법을 떠올렸습니다.예: n = 12인 경우가장 큰 제곱수인 9 (3²)를 선택12 - 9 = 3 → 나머지 3을 다시 제곱수 합으로 표현: 1² + 1² + 1²결과: 12 = 9 + 1 + 1 + 1 → 4개 사용하지만, 더 나은 해가 존재합니다:12 = 4 + 4 + 4 (2² + 2² + 2²) → 3개1: .. 2025. 2. 20. [Android/Compose] LazyColumn vs RecyclerView 비교 : RecyclerView 없이 리스트 만들기 Jetpack Compose를 공부하면서 LazyColumn을 접하게 되었습니다.기존에는 리스트 성능을 최적화하려면 RecyclerView를 사용하고, 그때마다 Adapter와 ViewHolder를 직접 구현해야 했습니다.그런데 LazyColumn을 사용하면 코드가 훨씬 간결해지면서도 자동으로 성능이 최적화된다는 점이 신기했습니다.그래서 기존 RecyclerView와 비교하며 어떤 차이가 있는지 정리해보려고 합니다.1. 기존 RecyclerView의 동작 방식RecyclerView는 리스트의 성능을 최적화하기 위해다음과 같은 요소들을 개발자가 직접 구현해야 합니다.Adapter → 리스트 데이터를 표시하는 역할 ViewHolder → 뷰를 재사용하여 성능을 최적화 LayoutManager → 리스트의 배.. 2025. 2. 19. [Android/Coroutine] launch vs async 차이점 정리 Coroutine에서 launch와 async는 모두 새로운 코루틴을 시작하는 데 사용되지만, 반환값을 처리하는 방식이 다릅니다.이 글에서는 공부한 내용을 정리하며, launch와 async의 차이를 코드 예제와 함께 살펴보겠습니다.1. launch: 결과를 반환하지 않는 Jobval job = GlobalScope.launch { delay(1000L) println("launch 완료!")}job.join() // 완료될 때까지 대기특징launch는 Job을 반환합니다.Job은 단순히 실행을 시작하고, join()을 호출하기 전까지는 실행 완료 여부를 기다리지 않습니다.launch는 비동기적으로 실행되지만, 결과 값을 반환하지 않습니다.즉, 실행은 하지만 결과를 받아서 처리하는 용도가 아닙.. 2025. 2. 19. [Algorithm/Kotlin] 백준 11659번 구간 합 구하기 4: 누적 합(Prefix Sum)을 활용한 풀이법 문제 설명주어진 수열에서 특정 구간 [i, j]의 합을 여러 번 구해야 하는 문제입니다. 입력으로 N개의 수와 M개의 구간이 주어집니다. 각 구간에 대해 빠르게 합을 구하는 프로그램을 작성해야 합니다. 제한 사항1 ≤ N ≤ 100,0001 ≤ M ≤ 100,0001 ≤ i ≤ j ≤ N각 숫자는 1,000 이하의 자연수문제 해결 아이디어기본 접근법 (O(N × M), 시간 초과 가능) M개의 구간 합을 구하기 위해 for 루프를 사용해 N개의 값을 더하면 O(N × M) 시간이 걸립니다. N, M이 최대 100,000일 경우 10^10 이상의 연산이 발생하여 비효율적입니다.누적 합(Prefix Sum) 기법 (O(N + M), 효율적) 먼저 누적 합 배열을 생성하여 O(N) 시간에 각 위치까.. 2025. 2. 19. 이전 1 2 3 4 5 ··· 12 다음 반응형