알고리즘 123

[백트래킹] 알고리즘 - 백트래킹 (Backtracking)

백트래킹 재귀적으로 문제를 하나씩 풀어나가되 현재 재귀를 통해 확인 중인 상태(노드)가 제한 조건에 위배되는지 판단하고 위배되는 경우 해당 상태를 제외하고 다음 단계로 나아가는 방식이다. 해를 찾는 도중에 막히면 해당 상태로 더 탐색하지 않고 돌아가서 해를 찾아나가는 방식이다. 이때 더 이상 탐색할 필요가 없는 상태를 제외하는 것을 가지치기(pruning)이라고 한다. 모든 경우의 수를 체크하지 않게 되므로 시간을 단축할 수 있다. 유사한 알고리즘으로 DFS(깊이 우선 탐색)이 있다. DFS와 백트래킹의 차이는 DFS는 모든 경우의 수를 탐색하지만 백트래킹은 DFS와 다르게 백트래킹은 불필요한 탐색을 하지 않는다. 사용 문제 의사결정 문제 최적화 문제 열거 문제 핵심 아이디어 재귀 호출 : 문제를 해결하..

알고리즘/개념 2023.08.07

[프로그래머스] 단어 변환 by 파이썬 (Python) : DFS

https://school.programmers.co.kr/learn/courses/30/lessons/43163 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 난이도 LV 3 문제 설명 시작 단어 begin, 도착 단어 target이 주어지고 변환할 수 있는 단어의 배열 words가 주어진다. 변환할 수 있는 조건은 한번에 한 개의 알파벳만 바꿀 수 있고, words안에 있는 단어로만 변경이 가능하다. 최소 몇단개에 걸쳐 begin의 단어를 target으로 변환 가능한지 Retrun해준다. 만약 변환할 수 없는 경우 0을 Retrun 해준다. 해결법 d..

[프로그래머스] 야근 지수 by 파이썬 (Python)

https://school.programmers.co.kr/learn/courses/30/lessons/12927 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 난이도 LV 3 문제 설명 해야할 일이 works 배열에 각 일에 대한 필요 작업량이 저장되어 있다. 1시간에 작업량 1만큼을 할 수 있다. 퇴근 시간까지 남은시간 n 이 주어진다. 야근피로도는 퇴근 시간 이후 각 일의 남은 작업량의 제곱의 합이다. 가장 적은 야근 피로도를 계산해서 Return 해야한다. 접근 법 야근 피로도를 가장 낮추는 방법은 모든 일의 작업량을 균등하게 낮추는 것이다. 남은..

[프로그래머스] 최고의 집합 by 파이썬 (Python)

https://school.programmers.co.kr/learn/courses/30/lessons/12938 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 난이도 LV 3 문제 설명 자연수 n개로 이루어진 집합이 있다. 집합 원소들의 합은 s와 동일하다. 이때 가능한 집합 중 각 원소의 곱이 최대가 되도록 하는 집합을 Return해주어야 한다. 만약 집합이 존재하지 않는 경우에는 [-1]을 Return 한다. 접근법 우선 집합이 존재하지 않는경우는 집합 원소의 수(n)가 원소의 합 (s)보다 크면 집합이 없다. (원소가 자연수이기 때문에 각 원소의 ..

[완전탐색] 알고리즘 - 완전탐색(Brute Force)

완전 탐색 (Brute Force) 가능한 모든 경우의 수를 탐색하면서 요구 조건에 충족되는 결과를 가져오는 알고리즘 이다. 해가 존재한다는 가정을 세우고 완전 탐색하기 때문에 무조건 정답을 찾을 수 있다. 복잡한 알고리즘을 생각하지 않고 모든 경우를 단순히 살펴본다고 볼 수 있다. 완전 탐색 알고리즘을 풀 때는 탐색해야할 전체 데이터 개수가 100만개 이하일 때 완전 탐색을 사용해야한다. 완전 탐색 종류 1. 선형 구조를 전체 탐색하는 순차 탐색 2. 비선형 구조를 전체 탐색하는 DFS(깊이 우선 탐색), BFS(너비 우선 탐색) 사용 조건 1. 문제에 대한 해결책이 잘 정의 되어 있어야 한다. - 해결책이 정의되어 있어야 브루트 포스를 사용한 해결책이 올바른 방법인지 확인할 수 있다. 2. 문제를 해..

알고리즘/개념 2023.08.03

[프로그래머스] 이중 우선 순위 큐 by 파이썬 (Python) : heap

https://school.programmers.co.kr/learn/courses/30/lessons/42628?language=python3 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 난이도 LV 3 문제 설명 I 숫자 형태일때는 큐에 해당 숫자를 삽입한다. D 1 형태일때에는 큐에서 최댓값을 삭제한다. D -1 형태일때에는 큐에서 최솟값을 삭제한다. 만약 큐가 비어있다면 [0,0] 출력 아니라면 [최대값, 최소값] return 해준다. 접근법 시간을 최대한 줄이기 위해 항상 맨 앞이 최소가 되는 heapq를 사용한다. 파이썬은 문자열에 문자를 인..

[프로그래머스] 정수 삼각형 by 파이썬 (Python) : 동적 계획법 (Dynamic programming)

https://school.programmers.co.kr/learn/courses/30/lessons/43105?language=python3 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 난이도 LV3 문제 설명 삼각형 모양으로 꼭대기에서 바닥까지 이어지는 경로 중 숫자의 합이 최대가 되는 경우의 합을 Return해준다. 아래칸으로 이동할때 대각선 방향으로 한칸 오른쪽 왼쪽 으로만 이동 가능하다. 접근법 삼각형 꼭대기 한칸 아래에서부터 위에서 내려올 수 있는 경우에 대해 최대 값을 더해준다. 만약 양끝에 있는 경우에는 가능한 값이 하나밖에 없으므로 별..

[동적 계획법] 알고리즘 - 동적 계획법 Dynamic Programming(DP)

동적 계획법(Dynamic Progamming) 하나의 큰 문제를 여러 개의 작은 문제로 나누어 그 결과를 저장하고 다시 큰 문제를 해결할 때 사용하는 알고리즘 설계 기법이다. 각 하위 문제를 먼저 해결하고 저장하기 때문에 같은 하위 문제가 나왔을 경우 저장한 값을 이용하여 간단하게 해결할 수 있다. 이를 통해 계산 횟수를 줄이기 때문에 하위 문제의 수가 기하 급수적으로 증가할 때 유용하다. 사용 용도 최단 경로 문제 행렬의 제곱 문제 최적화 문제 ex) 문제의 숫자 범위가 크고, 경우의 수가 많은 경우 사용 조건 - 아래 두 조건이 만족하는 경우 다이나믹 프로그래밍을 이용하여 문제를 해결하는데 유용하다. 부분 중복(반복) 문제 - 이미 진행했던 연산임에도 불구하고 재귀되며 반복적으로 연산되는 문제 최적..

알고리즘/개념 2023.07.31

[프로그래머스] 2019 KAKAO BLIND RECRUITMENT 길 찾기 게임 by 파이썬 (Python) : 트리 순회

https://school.programmers.co.kr/learn/courses/30/lessons/42892?language=python3 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 난이도 LV3 문제 설명 노드들이 좌표값으로 주어지고 이진트리를 만들어 전위 순회, 후위순회 결과를 Return해야한다. 아래의 규칙들로 트리 노드를 구성한다. 트리를 구성하는 모든 노드의 x, y 좌표 값은 정수이다. 모든 노드는 서로 다른 x값을 가진다. 같은 레벨(level)에 있는 노드는 같은 y 좌표를 가진다. 자식 노드의 y 값은 항상 부모 노드보다 작다...

[트리 순회] 알고리즘 - 트리 순회

트리 순회 트리 구조에서 각각의 노드를 정확히 한 번만 체계적인 방법으로 방문하는 과정을 말한다. 순회의 종류 전위 순회(preorder) : 뿌리(root)를 먼저 방문한다. 중위 순회(inorder) : 왼쪽 하위 트리를 방문 후 뿌리(root)를 방문한다. 후위 순회(postorder) : 하위 트리를 모두 방문 후 뿌리(root)를 방문한다. 레벨(층별) 순서 순회(level-order, 너비 우선 순회) : 위쪽 node부터 아래방향으로 차례로 방문한다. ex) 전위 순회 순서 노드를 방문한다. 왼쪽 서브트리를 전위 순회한다. 오른쪽 서브트리를 전위 순회한다. 방문 순서 A, B, D, G, H, E, C, F, I 중위 순회 순서 왼쪽 서브트리를 중위 순회한다. 노드를 방문한다. 오른쪽 서브트..

알고리즘/개념 2023.07.28