Algorithm

· Algorithm
- SOLID 원칙 : 객체 지향 프로그래밍에서 견고하고 유지보수 가능한 개발을 위한 원칙이다. - SRP, OCP, LSP, ISP, DIP 총 5가지가 합쳐져서 SOLID인데, 먼저 SRP부터 살펴보자SRP 단일 책임 원칙 Single Responsibility Principle- 클래스나 모듈은 하나의 책임만 가져야 하며, 오직 하나의 이유로만 변경되어야 한다.- 복잡성을 줄이기 위한 핵심 원칙으로, 클래스가 여러 가지 일을 할 때 발생할 수 있는 변경의 부담을 줄임- 코드의 가독성과 유지보수성을 향상- 변경이 필요할 때, 변경의 영향을 최소화할 수 있음class DataRepository(private val apiService: ApiService) { fun fetchData(): Dat..
· Algorithm
- 카테고리라는 테이블이 존재하고, 하위에 Book이라는 데이터가 리스트로 들어가는 구조가 있다. - 그리고 이 Book 또한 다른 테이블이고, 카테고리의 id를 외래키로 참조한다. - 카테고리의 id가 DB에 저장된 이후 업데이트되는 값이라 사실상 카테고리가 먼저 저장되지 않는 이상, Book 데이터가 저장될 수가 없는 상황이다. - 서비스에서는 매 동기화로 수신받은 카테고리가 DB에 존재할 경우에는 굳이 다시 DB 업데이트 로직을 진입하지 않는다. - 하지만 여기서 문제가... 카테고리는 제대로 저장되었어도 다음 Book 데이터 처리과정에서 사용자가 앱을 강제 종료하거나 어떠한 이유로 예외가 발생하여 동기화 상태가 완료되지 못한다면 카테고리 데이터만 남고, Book 데이터는 아무리 다시 동기화를 해도..
· Algorithm
- 클린 아키텍처에서 UseCase는 단일 책임 원칙 하에 앱에서 실행되는 비즈니스 프로세스를 캡슐화하는 역할을 한다. - UseCase를 구성함으로써 ViewModel의 역할을 명확히 할 수 있고, UseCase는 변경을 최소화 한 채 관심사를 분리하고, Activity 뿐만 아니라 View, Widget에서 즉시 사용 가능한 이점도 있다. - 근데 사이드 프로젝트에서 UseCase를 구성하고 관리하다 보니.. UseCase의 역할이 단순히 전달 정도로 밖에 안 되는 부분들이 많았다.class GetDestinationUseCase( private val repo: SettingsRepository) { operator fun invoke(): Flow = repo.getDestination..
· Algorithm
- 사용자가 저장할 수 있는 데이터는 일정 MAX Line을 지정해두지 않는 이상 무한하게 늘어날 수밖에 없다. - 결국 어느 순간부터는 백엔드로부터 데이터를 내려받는 시간이 길어질 것이고, 타임아웃과 사용자의 불편함을 초래할 수 있다. - 캘린더나 메모 서비스를 관리하면서 항상 이런 생각을 많이 했는데, 결국 데이터 뭉치를 어떻게 분할해서 백엔드에 요청을 해야 할지에 대해 많이 고민한 것 같다. - 기본적으로는 단순하게 개수를 기준으로 나눌 수 있다. - 쿼리 스트링 구성할 때도 보통 아래와 같은 제한점이 있는데, 앱에서도 이를 고려하여 매번 100~개씩 잘라서 내려주기를 요청하는 것이다.GET: URL에 쿼리스트링으로 데이터를 담음예: https://example.com/api?ids=1,2,3,....
· Algorithm
문제널리 잘 알려진 자료구조 중 최대 힙이 있다. 최대 힙을 이용하여 다음과 같은 연산을 지원하는 프로그램을 작성하시오.배열에 자연수 x를 넣는다.배열에서 가장 큰 값을 출력하고, 그 값을 배열에서 제거한다.프로그램은 처음에 비어있는 배열에서 시작하게 된다.입력첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0이라면 배열에서 가장 큰 값을 출력하고 그 값을 배열에서 제거하는 경우이다. 입력되는 자연수는 231보다 작다.출력입력에서 0이 주어진 횟수만큼 답을 출력한다. 만약 배열이 비어 있는 경우인데 가장 큰 값을 출력하라고 한 경우에는 0을 ..
· Algorithm
투 포인터(Two Pointers) 알고리즘은 정렬된 배열에서 효율적으로 특정 조건을 만족하는 값을 찾거나, 구간을 탐색하기 위해 사용되는 알고리즘입니다. 두 개의 포인터를 배열의 양 끝에 배치하거나 특정 위치에서 시작해, 이를 이동시키며 조건을 만족하는 값을 찾습니다. 정렬된 배열에서 가장 많이 사용됩니다.두 포인터를 사용하여 한 번의 탐색으로 문제를 해결하므로 시간 복잡도는 보통 O(N)입니다.이분 탐색처럼 중간 값을 탐색하지 않고, 포인터를 이동시켜 범위를 좁혀 나가는 방식입니다.투 포인터의 동작 원리배열의 양 끝에서 시작하거나, 시작 지점을 설정합니다.각 포인터의 값에 따라 조건을 확인합니다.조건에 따라 왼쪽 포인터를 오른쪽으로 이동하거나 오른쪽 포인터를 왼쪽으로 이동합니다.두 포인터가 교차하거나..
· Algorithm
배열의 중간 요소를 반복적으로 확인하며 탐색 범위를 절반으로 줄여나갑니다. 시간 복잡도는 아래와 같습니다.작동 원리정렬된 데이터: 이분 탐색은 반드시 정렬된 데이터에서만 동작합니다.중간 값 선택: 배열의 중간 값을 선택합니다.조건 비교:찾는 값이 중간 값보다 작으면 왼쪽 절반을 탐색합니다.찾는 값이 중간 값보다 크면 오른쪽 절반을 탐색합니다.찾는 값이 중간 값과 같으면 탐색을 종료합니다.반복: 값을 찾거나 범위가 비워질 때까지 반복합니다.fun binarySearch(array: IntArray, target: Int): Int { var low = 0 var high = array.size - 1 while (low return mid // 값을 찾은 경우 arra..
· Algorithm
https://www.acmicpc.net/problem/21930과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친 수(pinary number)라 한다. 이친 수는 다음의 성질을 만족한다.이친 수는 0으로 시작하지 않는다. 이친 수에서는 1이 두 번 연속으로 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다.예를 들면 1, 10, 100, 101, 1000, 1001 등이 이친 수가 된다. 하지만 0010101이나 101101은 각각 1, 2번 규칙에 위배되므로 이친 수가 아니다.N(1 ≤ N ≤ 90)이 주어졌을 때, N자리 이친수의 개수를 구하는 프로그램을 작성하시오. 케이스를 몇 번 조사해서 점화식을 통해 풀어내야하는 DP 문제입니다..
· Algorithm
복습하는 겸, 데이터 구조의 두 가지 종류인 선형과 비선형에 대해 정리를 진행 보겠습니다. 선형 구조- 데이터가 연속적이고 순차적으로 배치되는 구조입니다.- 각 요소는 하나의 선형 순서로 정렬되어 있으며, 각 요소는 이전 요소와 다음 요소와의 관계를 가집니다.- 종류에는 배열, 연결 리스트, 스택, 큐가 존재합니다.- 연속성 : 메모리에서 연속된 위치에 데이터가 저장됩니다 (특히 배열의 경우)- 접근 방식 : 각 요소는 단 하나의 직접 앞선 요소와 단 하나의 직접 뒤따른 요소를 가집니다.  - 탐색 시간 : 특정 요소에 대한 접근 시간은 구조에 따라 다릅니다. 예를 들어, 배열은 O(1)로 접근할 수 있지만, 연결 리스트는 O(n)이 걸릴 수 있습니다.- 연결 리스트의 경우에는 동적 할당을 통해 메모리 ..
SeungYong.Lee
'Algorithm' 카테고리의 글 목록