본문 바로가기

분류 전체보기

(83)
[iOS] Unit & UI Testing raywenderlich - iOS Unit Testing and UI Testing Tutorial 테스트는 앱이 거대하고 복잡해짐에 따라 버그를 숨기지 않고 안전하게 확장되도록 하는 중요한 장치이다. 이번 튜토리얼을 통해 다음 사항들을 테스트 해본다. 1. 앱의 Model 즉, 중심이 되는 논리나 기능. 2. Asynchronous methods (비동기적으로 진행되는 작업). 3. 라이브러리나 시스템 객체와의 상호작용을 가짜로 흉내내서 테스트하기 (Stubs and mocks). 4. UI Test. 5. Performance Test. 6. Code coverage tool (테스트를 거치는 실제 코드들을 확인하기). 어떤 것을 테스트할지 파악하기 테스트가 무엇을 위해, 그에 따라 어떤 부분에 필..
[iOS] MVC 구조의 앱을 MVVM 으로 바꾸기 raywenderlich - iOS MVVM Tutorial: Refactoring from MVC MVVM 으로 바꿀 때 장점 ViewController 가 단순해진다. Business logic 을 더 잘 표현 할 수 있다. ViewModel 이 ViewController 보다 테스트하기 쉽다. ViewModel? ViewController? MVVM 구조에서 ViewController 는 View 를 바꾸고 View 에서 받은 입력을 ViewModel 로 전달하는 일만 한다. 이 이외에 MVC 구조의 ViewController 가 하던 모든 일을 ViewModel 에게 전달할 것! ViewModel 은 View 입력을 받아 Model 갱신, Model 의 정보를 ViewController 에게 전달..
[iOS] 최고의 디자인 패턴, MVC 에 대한 오해 https://medium.com/flawless-app-stories/the-only-viable-ios-architecture-c42f7b4c845d The only viable iOS architecture Deep dive into MVC, MVVM, MVP, VIPER as a result of which we’ll understand that for iOS there is only one possible among them. medium.com MVC Model 은 "data", View 는 유저가 보는 것, Controller 는 중개자 역할. Controller 는 Model 에서 데이터를 받아 View 를 통해 User 에게 보여주거나, User 의 동작을 View 에서 받아와 Model..
[알고 스팟] 도시락 데우기 - 탐욕법 ※ 웹 환경에 최적화된 서식이므로 웹 페이지로 열람함을 권장. 도시락 데우기(링크) #include using namespace std; vector M, E; int lunchBox() { vector EM; // push -E[i] to sort it in descending order for (int i = 0; i < M.size(); ++i) EM.push_back(make_pair(-E[i], M[i])); // Sort by descending order of eating duration sort(EM.begin(), EM.end()); int ret = 0, beginEat = 0; for (int i = 0; i < EM.size(); ++i) { // Add microwave time ..
[알고 스팟] 출전 순서 정하기 - 탐욕법 ※ 웹 환경에 최적화된 서식이므로 웹 페이지로 열람함을 권장. 출전 순서 정하기(링크) 탐욕적으로 해결할 수 있을까? 매번 승부에서 탐욕적인 선택들을 시도해보자. 먼저 항상 가장 실력이 좋은 선수를 출전시킨다. 이 경우 2 번 이긴다. 러시아팀 3,000 2,700 2,800 2,200 2,500 1,900 한국팀 2,995 2,800 2,750 2,600 2,000 1,800 약간의 직관을 이용해 좀 더 개선해보자. 많은 게임에서 이겨야 하는데 실력 좋은 선수를 모두 먼저 내보내면 후반부에 레이팅이 높은 상대가 나오는 경우 속수무책이다. 따라서, 매번 게임에서 가장 근소한 차이로 이길만한 선수를 내보내자. 약한 상대를 만나는 경우에 우리팀의 강한 선수를 굳이 낭비하지 않을 기회를 얻을 수 있다. 이 경..
탐욕법에 대해서, 회의실 예약 문제 ※ 웹 환경에 최적화된 서식이므로 웹 페이지로 열람함을 권장. 탐욕법 문제를 여러 조각으로 쪼개고, 각 조각으로 답의 일부를 작성하는 것은 다른 알고리즘과 같다. 핵심은 각 조각을 해결할 때 눈 앞의 가장 좋은 방법을 선택하는 것이다. 즉, 지금 하는 선택이 남은 선택에 끼칠 영향을 고려하지 않는다. 탐욕법을 통해 최적해를 구할 수 있다면 동적 계획보다 빠르지만, 최적해를 찾지 못 하는 경우가 많다. 따라서, 탐욕법을 사용할 정당성을 증명하는 과정이 필요하다. 탐욕적으로 해결하는 순서 전체 문제를 여러 조각으로 나누고 각 조각을 해결함에 있어서 탐욕적인 선택이 무엇일지 생각해본다. 예제 입력 몇 개를 손으로 풀어보면 직관을 얻을 수도 있다. 동작할 것 같은 방법이 생각나면 다음 속성들을 증명해봐야 한다...
[알고스팟] Triangle Path 문제의 경로 개수 세기 - 동적 계획 Triangle path 문제의 경로 개수 세기(링크) #include using namespace std; vector triangle; int cache[100][100]; int n; int trianglePathMemoization(int y, int x) { // Base case if (y == triangle.size() - 1) return triangle[y][x]; // Memoization int& ret = cache[y][x]; if (ret != -1) return ret; return ret = triangle[y][x] + max(trianglePathMemoization(y + 1, x), trianglePathMemoization(y + 1, x + 1)); } int c..
[알고스팟] 타일링 방법의 수 세기 - 동적 계획 ※ 웹 환경에 최적화된 서식이므로 웹 페이지로 열람함을 권장. 타일링 방법의 수 세기(링크) 완전 탐색으로 생각한 후 메모이제이션을 적용하자. 각 작업 조각마다 2 x n 사각형의 맨 왼쪽 세로줄을 덮어 나간다. 맨 왼쪽 세로줄을 덮는 방법은 타일 하나를 세워서 놓거나, 두 개의 타일을 가로로 놓으면 된다. 타일 하나를 세워서 놓으면 가로의 길이가 n - 1 인 사각형이 남고 두 개의 타일을 가로로 놓으면 가로의 길이가 n - 2 인 사각형이 남는다. 2 x 2 인 사각형을 생각해보면 타일 하나를 세워 놓으면 2 x 1 인 사각형이 남고 타일 두개를 놓으면 사각형이 모두 채워진다. 따라서, 가로 길이가 1 혹은 0 인 경우에 (세로 타일 한 개를 놓으면 되거나 이미 사각형을 모두 채웠으므로 사각형을 채운..