전체 글397 [알고리즘] 그리디(Greedy) 알고리즘 그리디(Greedy) 알고리즘이란? Greedy를 해석해보면 "탐욕스러운"이다. 이 때문에 그리디 알고리즘을 다른 말로 탐욕 알고리즘이라고도 한다. 이 알고리즘은 선택을 할 때마다 최적의 상황만을 선택해 최종적으로 최적의 결과에 도달하게 된다. 여러 선택이 있을 때, 모든 경우의 수에서 최적의 선택을 했다고 하자. 이때 최적의 선택만을 골랐다 해서 최적의 결과만 나오는 것은 아니다. 최적의 선택이 모여 조금 덜 한 결과가 나오는 경우의 수가 있을 수도 있다. 그리디 알고리즘은 위와 같은 경우가 있어서는 안되며, 항상 최적의 선택만을 하여 최적의 결과가 나와야 하는 알고리즘이다. 정당성 증명 탐욕적 선택 속성(Greedy Choice Property): 현재의 선택이 이후의 선택에 영향을 주지 않으면서, .. Algorithm 2023. 11. 14. [알고리즘] 이진탐색 알고리즘(Binary Search) 이진 탐색(Binary Search)의 개념 이진 탐색은 정렬되어 있는 리스트 혹은 배열에서 탐색 범위를 절반씩 줄여나가며 특정 값을 찾는 알고리즘이다. 특정 범위의 숫자에서 상대가 생각한 값을 맞추는 업다운 게임을 예시로 들 수 있다. 만약 1~100이라는 범위에서 70이라는 값을 상대가 생각하고 있다고 할 때, 처음엔 50을 말하고, up이라는 반응이 나오면 50과 100의 반인 75를 말한다. 다음으로는 down이라는 반응이 나오고, 50과 75의 중간값인 62를 말한다. 이 과정을 반복해나가다보면 70이라는 값에 도달할 수 있게 된다. 위에서 예시로 들었던 업다운 게임은 결국 이진 탐색의 원리를 이용했다는 것을 알 수 있다. 이진 탐색의 동작 과정은 다음과 같다. 이진 탐색의 동작 과정 리스트의 .. Algorithm 2023. 11. 6. [알고리즘] 삽입 정렬(Insertion Sort) 삽입 정렬 정의 삽입 정렬은 정렬 알고리즘 중 가장 간단한 정렬 방식이다. 앞에서부터 차례대로 비교해가며, 자신의 위치를 찾아 삽입함으로써 정렬이 완성된다. 삽입 정렬은 두 번째 데이터부터 시작하여 그 앞에 있는 데이터와 비교하여 삽입할 위치를 지정한 후 데이터를 뒤로 옮기며, 이후 지정한 위치에 데이터를 삽입한다. 구현 fun main() { val list = mutableListOf(5, 8, 6, 2, 4) insertionSort(list) } private fun insertionSort(list: MutableList) { for(i in 1 until list.size) { val key = list[i] var j = i-1 while(j >= 0 && key < list[j]) { li.. Algorithm 2023. 10. 23. [알고리즘] 버블 정렬(Bubble Sort) 버블 정렬 정의 버블 정렬은 주어진 배열에서 인접한 두 개의 위치에 있는 데이터의 값을 비교하여 위치를 서로 교환하는 정렬 방식이다. 구현 package datastructure fun main() { val list = mutableListOf(5, 8, 6, 2, 4) bubbleSort(list) } private fun bubbleSort(list: MutableList) { for(i in 0 until list.size - 1) { for(j in 0 until list.size - 1) { if(list[j] > list[j+1]) { swap(list, j, j+1) } } println("${i+1}회전: $list") } } private fun swap(list: MutableList.. Algorithm 2023. 10. 22. [알고리즘] 선택 정렬(Selection Sort) 선택 정렬 정의 선택 정렬은 n개의 데이터 중에서 최소값을 찾아 첫 번째 데이터 위치에 놓고, 나머지 (n-1)개 중 다시 최소값을 찾아 두 번째 데이터 위치에 놓는 방식을 반복하여 정렬하는 방식이다. 즉, 한 번의 회전에 모든 데이터를 확인해봐야 한다. 구현 package datastructure fun main() { val list = mutableListOf(5, 8, 6, 2, 4) selectionSort(list) } private fun selectionSort(list: MutableList) { for(i in 0 until list.size) { for(j in i+1 until list.size) { if(list[i] > list[j]) { swap(list, i, j) } } p.. Algorithm 2023. 10. 22. [자료구조] 그래프(Graph) 그래프(Graph) 그래프는 연결되어있는 원소들 간의 관계를 표현한 자료구조이다. 일상 속에서의 대표적인 예시로는 지하철 노선도를 떠올릴 수 있다. 그래프 관련 용어 정점(vertex): 노드라고도 하며, 각 지점(위치)을 의미한다. 간선(edge): 정점들을 잇는 선을 의미한다. 사이클(cycle): 시작 정점과 종료 정점이 동일한 경우를 의미한다. 인접 정점(adjacent vertex): 간선에 의해 직접 연결된 정점을 의미한다. ex) A-B, C-E, C-F 정점의 차수(degree): 무방향 그래프에서 각 정점에서의 간선의 수를 의미한다. 그래프의 종류 1. 방향 그래프 간선에 방향이 존재하는 그래프 A와 B가 연결되어 있을 때, (A, B)와 (B, A)는 다르다. 2. 무방향 그래프 간선에.. 자료구조 2023. 10. 9. [자료구조] 우선순위 큐(Priority Queue) 우선순위 큐(Priority Queue) 우선순위 큐 전에 큐에 대해 알아보고 왔다. 큐는 처음 들어온 값이 처음으로 나가는 FIFO(First Input First Output) 형식의 자료구조였다. 그렇다면 우선순위 큐도 위와 같을까? 우선순위 큐는 이름에서 알 수 있듯이, 데이터가 들어온 순서가 아닌 우선순위가 높은 데이터부터 나가게 되는 자료구조이다. 즉, 가장 먼저 들어왔다고 해서 가장 먼저 나가는 형식이 아니다. 우선순위 큐는 힙(Heap)을 이용하여 구현된다. 따라서 힙에 대해 먼저 알아보려고 한다. 힙(Heap) 힙은 우선순위 큐를 위해 만들어진 자료구조이다. 완전 이진 트리 형태로 이루어져 있으며, 반정렬 상태(느슨한 정렬 상태)를 유지하며 부모노드와 서브트리간 대소 관계가 성립된다. 간.. 자료구조 2023. 10. 8. [자료구조] 트리(Tree) 트리 트리는 노드로 이루어진 자료구조이며, 다음과 같은 형태를 갖는다. 예를 들어, 컴퓨터의 폴더 즉, 디렉토리를 예로 들 수 있다. 한 디렉 토리 안에는 여러 디렉토리가 들어있을 수 있고, 그 안에 또 여러 개의 파일들이 있을 수 있다. 트리 관련 용어 루트 노드(root node): 부모가 없는 노드로, 최상위 노드를 뜻한다. 위의 트리 예시에서 A에 해당한다. 단말 노드(leaf node): 자식이 없는 노드. C, D, F, G, H가 해당한다. 간선(edge): 각 노드를 연결하는 선(branch 라고도 한다.) 형제(sibling): 동일한 부모를 갖는 노드를 의미한다. C, D, E는 B라는 동일한 부모를 가졌으므로 형제이다. 차수(degree): 각 노드가 지닌 간선의 수이다. 트리의 차수.. 자료구조 2023. 10. 2. [자료구조] 큐(Queue) 큐(Queue) 큐는 양 끝이 뚫린 파이프를 생각하면 된다. 한 쪽으로 데이터를 계속 해서 추가할 때, 다른 한 쪽으로 데이터를 빼내려 한다면 제일 처음 넣은 값부터 차례대로 나오게 된다. 즉, 처음 넣은 값이 처음 나오게 되는 First Input First Output(FIFO) 원리를 갖는다. 구현 큐의 기능은 다음과 같다. push: 큐에 데이터를 넣는다. pop 또는 poll: 큐에서 가장 앞에 있는 데이터를 빼고 반환한다. size: 큐에 들어있는 데이터의 갯수를 반환한다. isEmpty: 큐가 비어있는지를 반환한다. front 또는 peek: 큐의 가장 앞에 있는 원소를 반환한다. back: 큐의 맨 뒤에 있는 값을 반환해준다. 자바에는 존재하지 않는 내장함수로, c++에 존재한다. clas.. 자료구조 2023. 9. 30. [자료구조] 스택(Stack) 스택이란? 스택은 한쪽 끝에서만 데이터를 넣고 뺄 수 있는 자료구조이다. 스택은 위와 같은 형태이다. 위의 빈 공간으로 데이터가 들어오고 나갈 수 있다. 위의 사진에서 2라는 데이터를 stack에 넣고, 값을 빼내고자 할 때 2부터 값이 나오는 것을 알 수 있다. 즉, 마지막으로 들어간 값이 처음으로 나온다는 Last Input First Output(LIFO) 형태를 따른다. 구현 스택의 기능은 다음과 같다. push: 스택에 값을 넣는다. pop: 스택에서 가장 위에 있는 값을 빼내고 이를 출력한다. size: 스택에 들어있는 원소의 개수를 출력한다. empty: 스택이 비어있는지 아닌지 출력한다. peek 또는 top: 스택에서 가장 위에 있는 값을 출력한다. 아래 코드로 기능들을 어떻게 구현했는지.. 자료구조 2023. 9. 26. [자료구조] 리스트(2).연결리스트(LinkedList) 연결리스트(LinkedList) 순차리스트가 배열로 구성된 리스트라면, 연결리스트는 노드로 구성된 리스트이다. 노드는 두 가지의 정보를 가지고 있다. 데이터 다음 노드를 가리키는 포인터 즉, 다음과 같은 형태를 갖게 된다. 이때 pointer는 다음 노드의 주소를 값으로 갖고 있게 된다. 코틀린에서의 LinkedList를 열어 Node를 보면 다음과 같다. private static class Node { E item; Node next; Node prev; Node(Node prev, E element, Node next) { this.item = element; this.next = next; this.prev = prev; } } 위에서 Node는 데이터와 다음 노드를 가리키는 포인터로 이루어져있다.. 자료구조 2023. 9. 26. [자료구조] 리스트(1).순차리스트(ArrayList) 리스트란? 일상 생활 속 "위시 리스트", "버킷 리스트" 등 리스트가 담긴 단어를 종종 사용한다. 위시리스트는 자신이 원하는 것을 목록으로 작성해둔 것이고, 버킷 리스트는 자신이 해보고자 하는 것들을 목록으로 작성해둔 것이다. 자료구조의 리스트 또한 데이트의 목록을 의미한다. 리스트는 순차리스트(ArrayList)와 연결리스트(LinkedList) 2가지로 나뉘게 된다. 순차리스트(ArrayList) 순차리스트는 데이터들이 순서대로 메모리에 저장되는 자료구조이다. 즉, 논리적인 순서와 물리적인 순서가 동일한 구현 방식을 갖는다. 배열을 이용해 리스트를 구현한 것으로, 접근이 빠르다는 장점이 있다. 하지만 값을 추가하고 삭제하는데 있어서는 느리다는 단점 또한 존재한다. 삽입(add) ArrayList의 .. 자료구조 2023. 9. 25. [자료구조] 배열(Array) 배열 배열이란 동일한 자료형을 연속적으로 저장하는 자료구조이다. 주소값을 확인해보면 4씩 증가하는 것을 확인할 수 있다. 이는 int형 데이터를 저장하기에 int의 크기인 4바이트씩 증가하는 것이다. 주소값은 각 자료형의 크기만큼 일정하게 증가하게 된다. 즉, char형 배열이라면 주소값이 1씩 증가하고, double형이라면 8씩 증가하게 된다. 배열의 선언 언어마다 배열의 생성 방법은 다르다. 여기서는 c++을 이용해서 해보도록 하겠다. #include using namespace std; int main() { int arr[5]; for(int i=0; i 자료구조 2023. 9. 23. 우분투에 ssh 서버 설치하기 우분투에 ssh를 설치하기 전에 다음의 명령어를 통해 서버에 설치된 프로그램을 전체적으로 업그레이드 해준다. $ sudo apt update $ sudo apt upgrade 완료되었다면 다음의 명령어를 통해 Open SSH server를 설치할 수 있다. $ sudo apt install openssh-server Y또는 y를 입력하여 작업을 계속하면 된다. 설치가 완료되었다면 ssh 서버가 자동으로 실행된다. ssh 서버가 실행되고 있는지 확인하고 싶다면 다음의 명령어를 통해 확인할 수 있다. $ sudo systemctl status ssh 외부에서 서버로 접속할 때는 다음과 같은 형태로 접근 가능하다. $ ssh -p @ -p 옵션은 포트번호를 표기하는 옵션이다. ssh 서버를 설치하였다면 기본적.. Linux 2023. 9. 1. [백준/BOJ] 2212번: 센서 문제 https://www.acmicpc.net/problem/2212 2212번: 센서 첫째 줄에 센서의 개수 N(1 ≤ N ≤ 10,000), 둘째 줄에 집중국의 개수 K(1 ≤ K ≤ 1000)가 주어진다. 셋째 줄에는 N개의 센서의 좌표가 한 개의 정수로 N개 주어진다. 각 좌표 사이에는 빈 칸이 하나 있 www.acmicpc.net 해설 문제를 요약해 보자면, n개의 센서와 k개의 집중국이 있을 때 집중국의 수신 가능영역의 최소 거리 합을 구하는 것이다. 센서는 평면상의 직선에 있으므로, 각 센서의 거리를 구하기 위해 오름차순으로 센서의 위치를 정렬해 준다. 문제의 예시 1을 보면 센서의 위치는 [1, 3, 6, 6, 7, 9]가 된다. 각 센서의 거리 사이는 [2, 3, 0, 1, 2]이 되는.. PS(Problem Solving)/BOJ 2023. 8. 22. [Compose] Compose Text Text 선택 일반적으로 Composable은 선택할 수 없다. 다음과 같은 코드가 있을 때 결과를 보자. class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { ComposeStudyTheme { Surface( modifier = Modifier .width(200.dp) .height(100.dp), color = MaterialTheme.colors.background ) { TextStudy() } } } } } @Composable fun TextStudy() { Text("Example Str.. Android/Compose 2023. 7. 18. [Compose] LazyColumn이란? LazyColumn이란? android developer에서 lazy column은 다음과 같이 정의되어 있다. 현재 표시된 항목만 구성하고 배치하는 세로 스크롤 목록입니다. 이 content블록은 다양한 유형의 항목을 내보낼 수 있는 DSL을 정의합니다. LazyListScope.item예를 들어 단일 항목을 추가하고 LazyListScope.items항목 목록을 추가하는 데 사용할 수 있습니다 . 이 설명을 읽어보면 "RecyclerView"가 떠오를 것이다. LazyColumn은 세로로 아이템을 표시하고, LazyRow는 가로로 아이템을 표시한다. LazyColumn의 원형 @Composable fun LazyColumn( modifier: Modifier = Modifier, state: Lazy.. Android/Compose 2023. 7. 11. [Compose] @Preview 분석 Android의 Jetpack Compose는 @Preview 어노테이션을 통해 미리보기를 지원한다. 그렇다면 @Preview 어노테이션은 어떻게 구성되어 있을까? 이번 글에서는 이에 대해 알아보고자 한다. @Preview 어노테이션 구성 @Preview 어노테이션의 구성은 다음과 같다. @Repeatable annotation class Preview( val name: String = "", val group: String = "", @IntRange(from = 1) val apiLevel: Int = -1, // TODO(mount): Make this Dp when they are inline classes val widthDp: Int = -1, // TODO(mount): Make this .. Android/Compose 2023. 6. 27. [Compose] Compose의 Side-Effect(3) 이전 포스팅에서 이어서 작성. https://jjunsu.tistory.com/383 [Compose] Compose의 Side-Effect(2) Compose의 Side-Effect(1) 이전 내용에서 이어서 작성. https://jjunsu.tistory.com/382 [Compose] Compose의 Side-Effect(1) Compose의 부수 효과 부수 효과는 구성 가능한 함수의 범위 밖에서 발생하는 앱 상태에 관한 변 jjunsu.tistory.com derivedStateOf: 하나 이상의 상태 객체를 다른 상태로 변환 특정 상태가 계산되거나 다른 상태 개체에서 파생되는 경우 derivedStateOf를 사용한다. derivedStateOf를 사용하면 계산에 사용된 상태 중 하나가 변경될 .. Android/Compose 2023. 5. 15. [Compose] Compose의 Side-Effect(2) Compose의 Side-Effect(1) 이전 내용에서 이어서 작성. https://jjunsu.tistory.com/382 [Compose] Compose의 Side-Effect(1) Compose의 부수 효과 부수 효과는 구성 가능한 함수의 범위 밖에서 발생하는 앱 상태에 관한 변경사항이다. 즉 자신이 아닌 외부의 상태에 영향을 만드는 것이다. 예측할 수 없는 리컴포지션 또는 jjunsu.tistory.com DisposableEffect: 정리가 필요한 효과 키가 변경되거나 Composable을 종료한 후 정리가 필요할 때 DisposableEffect를 사용한다. 예를 들어, LifecycleObserver를 사용하여 Lifecycle 이벤트를 기반으로 애널리틱스 이벤트를 전송할 때 Compos.. Android/Compose 2023. 5. 9. 이전 1 2 3 4 ··· 20 다음 728x90