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