본문 바로가기

숨막히는 알고말고

(211)
[Baekjoon] 로봇 조종하기(BOJ 2169) 👀 문제 설명 문제 NASA에서는 화성 탐사를 위해 화성에 무선 조종 로봇을 보냈다. 실제 화성의 모습은 굉장히 복잡하지만, 로봇의 메모리가 얼마 안 되기 때문에 지형을 N×M 배열로 단순화 하여 생각하기로 한다. 지형의 고저차의 특성상, 로봇은 움직일 때 배열에서 왼쪽, 오른쪽, 아래쪽으로 이동할 수 있지만, 위쪽으로는 이동할 수 없다. 또한 한 번 탐사한 지역(배열에서 하나의 칸)은 탐사하지 않기로 한다. 각각의 지역은 탐사 가치가 있는데, 로봇을 배열의 왼쪽 위 (1, 1)에서 출발시켜 오른쪽 아래 (N, M)으로 보내려고 한다. 이때, 위의 조건을 만족하면서, 탐사한 지역들의 가치의 합이 최대가 되도록 하는 프로그램을 작성하시오. 입력 첫째 줄에 N, M(1≤N, M≤1,000)이 주어진다. 다음..
[Baekjoon] 욕심쟁이 판다(BOJ 1937) 👀 문제 설명 문제 n*n의 크기의 대나무 숲이 있다. 욕심쟁이 판다는 어떤 지역에서 대나무를 먹기 시작한다. 그리고 그 곳의 대나무를 다 먹어 치우면 상, 하, 좌, 우 중 한 곳으로 이동을 한다. 그리고 또 그곳에서 대나무를 먹는다. 그런데 단 조건이 있다. 이 판다는 매우 욕심이 많아서 대나무를 먹고 자리를 옮기면 그 옮긴 지역에 그 전 지역보다 대나무가 많이 있어야 한다. 만약에 그런 지점이 없으면 이 판다는 불만을 가지고 단식 투쟁을 하다가 죽게 된다. 이 판다의 사육사는 이런 판다를 대나무 숲에 풀어 놓아야 하는데, 어떤 지점에 처음에 풀어 놓아야 하고, 어떤 곳으로 이동을 시켜야 둘 다 소중한 생명이지만 판다가 최대한 오래 살 수 있는지 고민에 빠져 있다. 우리의 임무는 이 사육사를 도와주는..
[Algorithm] Dynamic Programming 🤔 동적 프로그래밍(Dynamic Programming) 알고리즘을 짤 때, 보통 분할 정복 기법(Divide-Conquer)을 사용하는 경우가 많다. 분할 정복 기법은 큰 문제를 작은 여러 개의 문제로 나눠 푸는 기법인데, 작은 문제들을 풀다 보면 같은 문제들을 반복해서 푸는 경우가 생기게 된다. 동적 프로그래밍(Dynamic Programming)은 이런 문제들을 매번 다시 계산하지 않고, 테이블을 사용해 계산한 값을 저장해두었다가 재사용하는 기법이다. (쉽게 생각하면, 점화식을 생각하면 된다.) 분할 정복 기법(Divide-Conquer)은 한 문제를 겹치지 않는 부분 문제들로 분할하여 해당 문제들을 재귀적으로 해결한 후, 각각의 결과를 다시 결합하여 원래의 문제를 해결한다. 동적 프로그래밍(Dyn..