본문 바로가기

전체 글

(129)
[iOS] coreML 사용하여 multi class classification 모델 생성 및 프로젝트 반입하기 프로젝트를 진행하던 중 multi class classification을 해야할 일이 생겼다. 프로젝트가 아직 진행 중이라 다 말할 수는 없지만 사용자의 선택지에 따라 선택에 맞는 결과를 분류하여 class 중 하나를 보여줘야 하는 것이 목표다. 기계학습에서 배운 지식을 활용하면 multi class classification에는 여러 가지 모델을 사용할 수 있다. logistic regression, MLP, SVM 등등이 있다. 그런데 apple에서는 coreML이라는 것을 제공하는데 이 안에 tabular 데이터를 classification 해주는 라이브러리가 있다. 사실 공개된 swift ML 라이브러리도 많고, 직접 구현하는 것도 재미가 있지만 이미 있는 걸 최대한 활용하는 것이 개발자의 덕목(..
[iOS] Apple Developer Document: UICollectionView 인턴하면서 UIcollectionView 다루는 일이 있어서 그냥 공식 문서를 정독하기로 했다. 읽어서 직접 번역한 자료이기 때문에 이해하기 쉽게 의역한 부분이 있다. https://developer.apple.com/documentation/uikit/uicollectionview Apple Developer Documentation developer.apple.com UICollectionView 커스텀 가능한 레이아웃을 사용하여 정렬된 데이터 아이템들을 관리하고 나타내는 객체 Overview UI에 collection view를 추가할 때, 개발자의 앱에서 주요한 일은 collection view와 관련된 데이터를 관리하는 것이다. Collection view는 data source 객체에서 데이터..
[iOS] SnapKit을 사용하여 AutoLayout constraint 설정하기 AutoLayout을 사용하여 쉽게 view 객체들 간의 constraint를 설정하는 라이브러리를 알아보자 실제로 인턴 다니는 회사에서 사용하는 라이브러리인데, 처음 접해보고 진짜 너무 편하고 좋아서 사이드 프로젝트에도 적용하고 있음.. 1. SnapKit 공식 문서 snapkit은 cocoapod을 통해 설치 가능하다. GitHub - SnapKit/SnapKit: A Swift Autolayout DSL for iOS & OS X A Swift Autolayout DSL for iOS & OS X. Contribute to SnapKit/SnapKit development by creating an account on GitHub. github.com 깃허브를 방문하면 자세한 정보들을 얻을 수 있고..
DP + LCS Algorithm에 대한 이해: 최장 공통 부분 수열 (Longest common subsequence problem) LCS : 최장 공통 부분수열 문제 주어진 여러 개의 수열 모두의 부분수열이 되는 수열들 중에 가장 긴 것을 찾는 문제이다. 다시 말해서 두개의 수열 사이에서 가장 긴 공통 부분 수열을 구하는 문제이다. 이때 주의할 점은 substring이 아니라 subsequence 이기 때문에 연속하지 않아도 된다는 것이다. LCS 풀이 접근 방법 그럼 LCS는 어떻게 구할 수 있을까? 기본 아이디어는 DP를 사용한다. 예를 들어 ACAYKP, CAPCAK 두 문자열의 LCS를 구한다고 해보자. 이때 두 문자열을 하나씩 늘려가면서 비교해가는 방법이 가장 쉬운 접근이다. 이때 DP를 사용하여 dp 테이블에 값을 저장한다. 문자열 ACAYKP와 두번째 문자열의 첫번째 char인 C와 최장 공통 수열의 길이는 1이다. 이..
[C++/LeetCode] Minimum Operations to Reduce X to Zero - using Sliding Window Daily LeetCoding Challenge for June, Day 11. 문제 아이디어: Sliding Window Sliding Window 특정 조건의 연속 합을 구할 때 고정된 사이즈의 윈도우를 이동시키며 O(N)으로 푸는 알고리즘 Two-Pointer 알고리즘과 달리 고정된 길이의 윈도우를 이동시킬 때 사용한다. 또한 정렬되어 있지 않아도 사용할 수 있다는 점에서 유용하다. 윈도우의 크기가 고정적이기 때문에 포인터가 2개일 필요도 없이 왼쪽 또는 오른쪽 포인터에 사이즈를 더하고 빼는 것으로 쉽게 윈도우의 범위를 구할 수 있다. 주로 Map을 이용해서 구현한다. Sliding Window 알고리즘의 특성과 시간 복잡도가 O(N)인 이유 sliding window의 특징은 윈도우의 크기가 고정..
음수 간선을 가지는 그래프의 최단 경로: 벨만-포드 알고리즘 최단 경로 알고리즘은 대표적으로 플로이드 워셜, 다익스트라 등등 있지만 이 중에서도 한 노드에서 다른 노드까지의 최단 경로에는 다익스트라 알고리즘이 사용된다. 하지만 다익스트라 알고리즘은 양수에서만 동작한다. 왜 다익스트라 알고리즘은 양수 간선에서만 해를 찾을 수 있을까? 벨만 포드 알고리즘의 대표적인 문제들 11657 타임머신 문제를 해석하면 위와 같다. 한 노드에서 다른 노드까지의 최단 경로인데, 이때 음수 간선이 있을 수 있다. 따라서 벨만 포드 알고리즘을 사용하면 쉽게 해결할 수 있는 문제이다. 구현 // 11657 타임머신 #include #include using namespace std; vector graph[501]; long dist[501];// long type이어야 함 int N,..
[C++/1697, 11779] 탐색 중 이전 값를 저장해야 하는 유형의 문제들 경로나 값을 저장해서 다음에 그 값을 참조해야 하는 경우의 문제들을 정리해보자. 대부분 그래프 탐색이나 BFS, DFS 문제에서 경로 찾기, 걸린 시간 등 출발지에서의 값을 가지고 있어야 하는 경우가 많다. 1697 문제 아이디어: BFS 현재 값인 N에서 가능한 동작은 3가지이다. +1, -1, 2배 이다. 이 경우로 탐색 가능한 값에 대해서 (현재 값까지 걸린 시간 + 1)을 더해서 저장해두고 이에 대해서 다시 탐색을 도는 방식으로 문제를 해결할 수 있다. 이때 저장해두는 값은 시작 노드인 N에서부터 걸린 시간이 된다. 구현 // 1697 숨바꼭질 #include #include using namespace std; int main() { cin.tie(0); ios::sync_with_stdio(f..
[iOS] UIKit 알림창 UIAlertController customizing 하기 UIKit에서 알림창을 띄우는 객체는 UIAlertController이다. 경고창과 액션 시트 두 가지를 모두 구현 가능하며 다음과 같이 구현할 수 있다. 1. Alert 구현 let alert = UIAlertController(title: "Alert", message: "Alert창 입니다.", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) self.present(alert, animated: true); 위와 같이 알림창의 버튼은 UIAlertAction 객체이며 이 객체를 addAction 메소드를 사용하여 UIAlertController 객체에 추가해줘야 한다. 2..