최단 경로
`최단경로` 문제란 **두 노드를 잇는 가장 짧은 경로**를 찾는 문제다. **가중치가 있는 그래프**(Weighted graph)에서는 가중치의 합이 최소가 되는 경로를 찾는것이 목적이다.
Algorithm 태그가 포함된 포스트들입니다.
`최단경로` 문제란 **두 노드를 잇는 가장 짧은 경로**를 찾는 문제다. **가중치가 있는 그래프**(Weighted graph)에서는 가중치의 합이 최소가 되는 경로를 찾는것이 목적이다.
부분해의 최적해가 전체의 최적해가 되는 Greedy 알고리즘이다.
한 번 쯤은 접해봤을 법 한 `거스름돈` 문제이다.
`Heap` 유형으로 분류되었지만 문제 풀이의 흐름을 먼저 살펴보자.
문제 지문 자체가 애매하고 지문과 테스트케이스 사이에 모순이 존재하기 때문에 고생시키는 문제이다.
일전에 풀었던 문제를 복기할 겸 다시 풀었다.
문제를 보면 알 수 있듯이 `패턴 찾기` 문제이다.
`진법 구하기` 공식을 알고 있다면 쉽게 풀 수 있는 평이한 문제이다.
문제를 제대로 이해했다면 어렵지 않은 문제이다.
문제 풀이를 위해 필요한 자료구조는 `Stack`과 `Map`이다.
문제를 잘 읽고 그대로 코드로 옮기기만 하면 되는, 즉 `구현`만 잘 하면 되는 간단한 문제이다.
라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금 그곡' 서비스를 이용하곤 한다.
2차원 배열 형태의 4블록 문제이다.
기본적으로 `LRU(Least Recently Used)`에 대한 지식이 필요한 문제이다. 나같은 경우 찾아보기 귀찮아서 예제 입출력을 보고 `캐시 내에서 더 많이 hit한 요소가 가장 오래 유지`하는 것으로 오해하여 `우선순위 큐`를 이용하여 접근을 하였다.
데이터베이스 후보키 목록들을 알고리즘으로 선별하는 문제이다.
전형적인 `조합(Combination)` 문제이다. 조금 다른 것이 있다면 `소수 판별` 로직이 추가된다는 점이다.
문제는 길지만 어렵지 않은 문제이다. 문제 속에 힌트가 존재하기 때문에 그대로 구현만 하면 쉽게 풀 수 있다.
문제 자체만 보았을 때 어렵지 않다. 문자열을 검사하여 반복된 문자들을 제거하는 방향으로 생각하면 쉽게 풀린다.
`피보나치`는 `분기`가 필요한 재귀 알고리즘 중 가장 대표적인 문제이다.
2차원 배열의 `loop` 또는 `재귀`를 이용하여 해결이 가능하다. 또한 `시간 초과`를 피하기 위해 `메모제이션`을 활용해야 보다 효율적인 코드를 짤 수 있겠다.
`수학` 알고리즘에서 자주 출제되는 `최소 공배수` 구하기 문제이다. 다만 이 문제는 배열 내의 모든 수의 최소공배수를 구하는 문제로써, 어떻게 보면 최소공배수 알고리즘 공식을 배열 요소들 모두에 적용해야 한다고 생각할 수 있다.
문제 해결의 접근법을 찾지 못해 오랜시간 고민한 문제로써 결과적으로 다른사람들의 접근법 및 풀이법을 참고하여 풀이하였다.
2017 카카오코드 본선 1번 문제로써 최대 `8! (약 40000)`번의 계산 횟수를 갖는 `완전 탐색` 문제이다. 다시말해 개의 for문으로 구현을 해도 문제가 없다.
문제 해결의 실마리는 상당히 간단하다. 위 문제는 _+_ 또는 _-_ 로 __분기__ 되기 때문에 단순한 __for 루프__ 로는 해결하기 쉽지 않다.
처음 문제를 보고서 약 2시간 가량 접근법이 떠오르지 않아 한참을 고민하다가 결국 다른 분들의 블로그를 보고 접근법을 참고하여 해결하였다.
- [적절한 예시와 함께 개념, 시간복잡도까지 설명](https://ratsgo.github.io/data%20structure&algorithm/2017/11/27/bellmanford/) but `V-1`(경로의 길이) 설명이 조금 아쉬움