뭐 정말 별거 없지만.. leetcode 사용기? 사용방법? 에 대해 포스팅 해보려 합니다. 우리나라에서 유명한 알고리즘 문제풀이 사이트로는 백준, 프로그래머스 등이 있을 텐데요. 외국에서는 leetcode가? 유명한것 같습니다. 구글, 페이스북, 아마존 등.. 유수의 IT기업 코딩테스트를 준비하기 위해서 leetcode를 통해 공부하는 것 같네요. 그래서 만약 다양한 문제를 풀어보시고 싶으시거나 해외취업을 생각하시는 분들은 leetcode에 있는 문제를 많이 풀어보시는면 좋을 것 같습니다! 우선 leetcode.com에 들어가셔 회원가입을 하셔야 하는데요. 회원가입 절차라고 할 것도 따로 없네요;; 그냥 구글로 회원가입 하면 특별히 양식같은거 기입 안해도 됩니다 ㅎㅎ; 이제 로그인 후, 최상단에 Pro..
SOLID?? -> 객체지향 5가지 원칙의 앞글자를 따서 지은 이름, 이 원칙을 따라 프로그램을 설계하면 유지 보수 및 확장이 쉬운 소프트웨어를 만들 수 있음 1. 단일 책임의 원칙 (Single Responsibility Principle) 객체는 오직 하나의 책임을 가져야 함 -> 클래스의 목적을 명확히 함으로써 기능을 명확히 분리 기능이 명확히 분리되어 있어야 유지보수에 유리하다!! 2. 개방-폐쇄 원칙(Open-Closed Principle) 객체는 확장에 대해서는 개방적이되 수정에 대해서는 폐쇄적이어야 함. 3. 리스코프 치환 원칙 (Liskov Substitution Principle) 자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있다. 부모 클래스가 들어갈 자리에 자식 클래스를 넣어..
안녕하세요 ㅎㅎ 오늘은 알고리즘 문제풀이 시 가장 많이 사용하는 리스트(list), 집합(set), 딕셔너리(dictionary) 메서드의 시간 복잡도를 정리해보려 합니다. 본격적인 시작전에 왜 여러 자료형들의 메서드에 대한 시간 복잡도를 알아야 하는지 짚고 넘어갑시다! 보통 알고리즘 문제 풀때 리스트로 큐를 구현하시는 분들이 많으실 텐데요. 여기 큐를 pop하는 반복문을 돌려서 풀어야 하는 문제가 있다고 가정해 봅시다. 만약 리스로 큐를 구현했다면 다음과 같이 나타낼 수 있는데요. 리스트의 경우 마지막 원소를 pop하는 연산의 시간 복잡도는 O(1)이지만, 그 외의 원소를 pop할 경우 원소를 한 칸씩 당기기 때문에 시간 복잡도는 O(N)이 되게 됩니다. 결국 반복문과 중첩되니 전체적인 시간 복잡도는 ..
오늘은 프로그래머스의 코딩 테스트 고득점 Kit에 들어있는 DFS/BFS문제를 풀어보려 합니다. DFS/BFS는 코딩테스트에 자주 나오는 유형이니 4문제 다 풀어보면 좋을 것 같네요 오늘 풀어볼 문제는 여행경로입니다. programmers.co.kr/learn/courses/30/lessons/43164 처음 문제를 읽고 레벨3치고는 쉽네? 생각했는데, 테스트 케이스 1번 때문에 생각보다 애를 먹었네요. 그래서 아예 풀이를 갈아엎고 다시 풀었다는.. ㅜㅜ 저의 접근 방식은 이렇습니다. 1. 주어진 배열을 그래프로 만든다. (그래프 만드는 방법은 다양한 방법이 있겠지만, 저는 딕셔너리를 사용해서 인접 리스트 형식으로 만들었습니다.) 2. 큐를 만들고 (출발 노드, [경로]) 넣어준다. (처음엔 출발점이 무..
오늘은 기초적인 정렬 알고리즘을 알아보려 합니다. 대표적인 정렬 알고리즘으로는 선택 정렬, 버블 정렬(거품 정렬), 삽입 정렬, 셸 정렬(쉘 정렬), 병합 정렬, 퀵 정렬 등이 있는데요. 간단하게 선택 정렬, 버블 정렬, 삽입 정렬, 쉘 정렬 네 가지 정렬의 정의와 코드를 정리하고 각각의 알고리즘 실행 속도를 측정하여 성능을 비교해 보려 합니다. 1. 선택 정렬 주어진 배열에서 가장 작은 원소를 찾아 첫 번째 원소와 교환하고 두 번째 작은 원소를 찾아 두 번째 원소와 교환하고... 반복하는 정렬 방법 정렬 방법 1. 주어진 배열 중 최솟값을 찾는다. 2. 그 최솟값을 맨 앞의 원소와 교환한다. 3. (N-1)원소에 대해 1-2 방법 반복 소스코드(파이썬) def select_sort(a: list) ->..
큐 먼저 들어온 데이터가 먼저 나가는 자료구조 -> 선입선출(First-In First-Out) ex) 매표소 대기줄: 먼저 온 사람이 먼저 계산 종류: 선형큐, 원형 큐, 덱... enqueue: 큐의 끝에 데이터 추가 dequeue: 큐 맨 앞의 데이터 제거 & 반환 ● 큐의 연산 init(q) - 큐 초기화 is_empty(q) - 큐가 공백상태인지 검사 is_full(q) - 큐가 포화상태인지 검사 enqueue(q,e) - 큐의 끝에 데이터(e) 추가 dequeue(q) - 큐의 맨 앞 데이터 제거 및 반환 peek(q) - 큐의 맨 앞 데이터 반환 ● 선형큐(Linear Queue) 배열을 이용해 선형 큐를 구현해 보겠습니다. #include #include #define MAX_QUEUE_S..
이전 글에서 간단한(?) carousel effect가 들어간 컬렉션뷰를 만들어봤었는데요. 이제 우리가 최종적으로 만들려고 하는 위와 같은 컬렉션뷰를 만들어 보겠습니다. 기존 코드에서 우리가 만들었던 setupLayout 메서드 일부와 transformLayoutAttributes 메서드만 수정해주면 됩니다 ㅎㅎ 접근 방식 1. 우선 스케일의 변화가 기존 2단에서 3단으로 변하기 때문에, 거리에 따라 달라지는 ratio 공식을 수정해야합니다. 2. 아이템간의 스페이싱이 음수이기 때문에, (즉 여러 아이템들이 겹쳐지는 컬렉션뷰이기 때문에) 앞에 있는 아이템이 뒤에 있는 아이템에 가려지지 않도록 하는 적절한 조치가 필요합니다. 3. paging이 가능하도록 만들자! ● setupLayout() 변경 전 le..
오늘은 아래와 같은 컬렉션 뷰를 구현하는 방법을 알려드리려고 합니다. 참고! 제 글을 읽기전에 기초적인 UICollectionView에 대한 이해를 필요로 합니다! [iOS] UICollectionView 기초 정리(1), [iOS] UICollectionView 기초 정리(2)를 보고 와 주세요. 본격적인 시작 전에, UICollectionView와 UICollectionViewLayout이 어떻게 상호작용 하는지에 대해 짚고 넘어갈 필요가 있습니다. UICollectionView는 CollectionViewLayout을 기반으로 뷰를 그리게 되는데, 레이아웃이 업데이트될 때마다 컬렉션 뷰는 레이아웃에 아이템(셀)에 대한 사이즈 및 속성들에 대한 정보를 요청합니다. 그럼 레이아웃은 그 정보들을 컬렉션 ..
오늘은 앞서 배운 내용을 바탕으로 간단한 grid 형태(격자 형태)의 콜렉션뷰를 만들어 보겠습니다. 최대한 다양한 내용을 써먹기 위해 Section은 2개로 하고 headerView footerView 두개 다 추가하려 합니다. ㅋㅋ (예쁘게 꾸미려고 만드는 뷰가 아니기때문에..!) headerView - 빨간색, footerView - 보라색, cell - 파란색 먼저 스토리보드에 UICollectionView를 추가 한 후, 다음과 같이 오토레이아웃을 잡아 줍니다. 이후 꼭 설정 변경하셔야 할 부분이 Estimate Size 입니다. 이 Estimate Size가 Automatic으로 되어 있을 텐데, 이부분을 None으로 바꾸어 주셔야 합니다. 이제 컬렉션뷰를 아울렛으로 연결 해 주시고, viewD..
스택 스택(stack) - 쌓아놓은 더미, 한쪽 끝에서 자료를 넣거나 뺄 수 있는 선형 자료구조, 후입선출(Last-In First-Out)구조로 가장 최근에 들어온 데이터가 가장 먼저 나간다. push - 스택에 데이터 추가 pop - 스택에서 데이터 삭제 ● 스택의 연산 create() - 스택 생성 is_full(s) - 스택이 포화상태인지 검사 is_empty(s) - 스택이 공백상태인지 검사 push() - 스택에 데이터 추가 pop() - 스택에서 데이터 삭제 peek(s) - 요소를 스택에서 제거하지 않고 보기만 하는 연산 ● 배열을 이용한 스택 구현 배열을 이용해 스택을 구현해 봅시다 ㅎㅎ 1차원 배열을 이용해 스택을 구현할 거고, 위에 적은 연산을 각각 함수로 구현할 겁니다! #inclu..