본문 바로가기

분류 전체보기

(64)
[프로그래머스] 달리기 경주 [Lv.1] 정답율 39% https://school.programmers.co.kr/learn/courses/30/lessons/178871 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr [풀이] - 리스트를 이용하면 시간 초과로 탈락. 해쉬 테이블(딕셔너리)를 만들어서 풀어야한다. [정답] def solution(players, callings): name_dict = {name:rank for rank, name in enumerate(players)} rank_dict = {rank:name for rank, name in enumerate(pla..
[알고리즘] 3-4 Dynamic Programming 1. 동적 프로그래밍(Dynamic Programming / DP) 메모리를 사용해서 중복 연산을 줄이고 수행속도를 개선한다. 즉, 중복 연산해야하는 것을 메모리에 저장하기에 그걸 호출해서 이용하는 것이다. '기억하며 풀기'라고 부르는 사람도 있다는데, 이 표현이 굉장히 정확하고 쉬운 것 같다. DP는 큐나 스택처럼 정해진 형태의 알고리즘이 아니다. 수행시간을 단축시키는 기법을 구현하는 것을 뜻하기에 사람마다 풀이법이 끝도 없이 달라질 수 있다. 1-1 분할 정복과의 차이 주어진 문제를 작은 문제들로 나누어 푼다는 면에서 비슷하다. 하지만 DP에서는 분할된 문제들이 중복된다는 특징이 있다. 1-2 어떤 문제를 DP를 통해 풀면 될까? 1) DFS / BFS로 풀 수 있지만 경우의 수가 너무 많은 문제 2..
[알고리즘] 3-3 DFS / BFS DFS, BFS 모두 탐색을 위한 알고리즘이다. 같은 모양의 그래프라도 DFS와 BFS는 각각 탐색 순서가 다르다. 1. DFS (깊이 우선 탐색) 특정 노드부터 끝까지 내려갔다가 다시 올라와 옆의 노드로 이동해 또 아래까지, 이걸 반복하여 끝까지 탐색한다. stack 또는 재귀함수로 구현 # 재귀함수를 이용한 DFS 활용 def dfs_recur(node, dfs_graph, dfs_list=[]): if node in dfs_list : return dfs_list dfs_list.append(node) if dfs_graph[node] == []: return dfs_list else : for num in dfs_graph[node] : dfs_recur(num, dfs_graph, dfs_lis..
[자료구조] 그래프 1. 그래프 그래프 자료구조란 개체들 간의 관계를 표현하는 추상적인 자료구조. 그래프는 방향이 있을수도, 없을수도 있다. 또, 순회하는 것도, 하지 않는 것도 있다. 트리 또한 그래프의 일종으로 볼 수도 있다. 하지만 그래프는 노드간의 관계, 트리는 노드간의 계층을 표현한다. 그래서 엄밀히는 다른 개념이다. 트리에는 그래프에는 없는 계층개념이 있기 때문이다. object간의 관계를 표현을 할 때 유용하다(SNS 친구 추천, 도로 상의 차량 검색, 운송시스템). 그래프는 기본적으로 vert(노드 또는 정점)와 edge(간선)으로 연결되어있다. 2. 가중치 그래프 가중치 그래프(Weighted Graph)는 간선에 가중치가 부여되어 있는 그래프를 뜻한다. 지도를 그래프로 표현했다고 생각하면 이해가 쉽다. 예..
[자료구조] 3-1 Hash 1. 해시 테이블 해싱(Hashing)은 쉽게 말해서 다 흩뜨려놓고, 키와 매칭되는 값을 검색하는 과정이다. 해시 테이블은 무언가를 찾을 수 있도록 한 사물에서 다른 사물로 매핑해야하는 경우에 적합하다. 키를 활용하여 값에 직접 접근이 가능한 구조로, O(1) 시간복잡도 안에 검색, 삽입, 삭제를 할 수 있다. Python 딕셔너리도 해시 테이블의 한 종류다. 1-1 array와의 비교 array의 검색 시간복잡도는 O(n), 해시는 O(1)로서 차이를 보인다. Hash의 key를 숫자로 바꾸어 index number로 저장하기 때문에 바로 찾을 수 있다. 하지만 array에서는 인덱스로 검색해도 모든 자료를 처음부터 순차적으로 보며 검색하기 때문에 느리다. 2. 해시 함수 해시함수는 키를 해시테이블 내..
[알고리즘] 2-4 퀵정렬 / 병합정렬 1. 분할 정복 알고리즘이라기보다는 방법이다. 뒤에서 배울 알고리즘(퀵정렬과 병합정렬)에 쓰이는. 재귀와 비슷한데, 문제를 비슷한 크기로 쪼개어 푼다. 1-1 분할정복의 과정 ① devide : 기존 문제를 작은 부분 문제들로 나눔 ② conquer : 각 부분문제를 해결 ③ combine : 부분 문제들의 솔루션을 통해 기존 문제를 해결 2. 병합정렬 예시로 설명하는 것이 더 쉽다. 봅시다. 다음과 같은 숫자 리스트를 정렬하고자 한다. [4,2,6,3,7,8,5,1] ① 입력값을 반으로 여러번 쪼갠다 [4,2,6,3,7,8,5,1] --> [4,2,6,3], [7,8,5,1] --> [2,4], [3,6], [7,8], [5,1] 가장 작게 쪼개졌다! ③ 잘게 쪼갠 아이템을 정렬한다 [2,4], [3,..
[알고리즘] 2-3 sorting (bubble / selection / insertion) 1. 버블 정렬 (bubble sorting) 왼쪽에서부터 두개씩 비교하여 swap. 입력 데이터 왼쪽에서 끝까지 모두 진행하고 나면 한 사이클이 돈 것이다. 제대로 정렬이 될 때까지 계속 이 사이클을 거친다. 2. 선택 정렬 (selection sorting) 현재 위치는 맨 왼쪽 아이템, 즉 1번. 현재 위치를 비롯해 모든 아이템을 살펴보고 가장 작은 아이템을 고른다. 그리고 현재 위치와 swap. 이번에는 현재 위치는 2번이다. 두번째 아이템부터 끝까지 가장 작은 아이템을 고른다. 그리고 현재 위치와 swap. 이러한 과정을 오른쪽으로 계속 옮겨가며 진행하면 된다. 3. 삽입 정렬 (insertion sorting) 두번째 아이템부터 시작하자. 두번째를 비롯해 왼쪽의 첫번째 아이템을 비교해 정렬한다..
[자료구조] 2-1 연결리스트 / 큐 / 스택 1. 연결리스트 연결리스트는 각각의 노드가 모여서 이루어진다. 하나의 노드는 data와 link로 이루어져 있다. link는 데이터가 작동하는 방향을 나타낸다. 1-1 배열(array)과의 비교 이해를 위해 일반적 배열과 비교해보자 배열 - random access 가능 (index가 있음) - 메모리에 저장될 때 연결되어 저장됨 - 선형 검색을 통하기 때문에 삽입 삭제에 O(n)이 걸림 연결리스트 - random access 불가능 (index 없음) - 메모리에 노드별로 산발적으로 저장됨. link가 있기에 다음 노드를 알 수 있음 - 삽입 삭제에 O(1)이 걸림. 굉장히 빠름 2. 스택과 큐 스택과 큐 모두 배열이되 어떤 규칙을 갖는 것으로 둘다 '추상적 자료구조'다. 또한 둘다 연결리스트의 한 종..