Algorithm
[1931] 회의실 배정 - Python
/* 문제 */ 한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다. 그리디 문제로 한 번의 실패 후 성공했다. 처음에는 회의 시간이 짧은 순서대로 정렬힌 후 가장 짧은 회의부터 회의실을 사용하도록 했다. 짧은 시간의 회의를 최대한 많이 포함해야 회의의 최대로 많이 할 수 있다고 생각했기 때문이다. #..
[11047] 동전 0 - Python
/* 문제 */ 준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다. 동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오. 그리디 알고리즘을 대표하는 '거스름돈' 문제와 비슷한 문제다. 이 문제를 그리디 알고리즘으로 풀 수 있는 이유는 문제의 조건이 다음과 같기 때문이다. 동전의 가치를 Ai라 할 때 Ai 는 Ai-1의 배수 큰 단위의 동전은 항상 작은 단위의 동전의 배수이다. 즉 작은 단위의 동전으로 만들 수 있는 값은 항상 그것보다 적은 수의 큰 단위 동전을 포함해 만들어낼 수 있다. 따라서 무조건 큰 단위의 동전을 최대한 많이 사용하는 것이 최적의 해가 된다. # 정답 코드 n,k = map(int,..
그리디 - 현재 상황에서 가장 좋아 보이는 것만을 선택하는 알고리즘
그리디 알고리즘은 현재 순간 가장 좋아 보이는 것을 선택하고 현재의 선택이 나중에 미칠 영향에 대해서는 고려하지 않는 알고리즘이다. 어떤 문제가 그리디 알고리즘 문제인지 의심된다면 단순히 현재 상황에서 가장 좋아 보이는 것만을 선택해도 풀 수 있는 문제인지를 판단한 후에 적용해야 한다. 그리디 알고리즘을 위한 문제가 아닌 대부분의 문제는 그리디로는 최적의 답을 찾을 수 없기 때문이다. 정해진 방법이 있는 알고리즘이 아니라 아이디어만 떠오른다면 비교적 간단하게 풀 수 있는 유형이기 때문에 문제를 풀어보면서 감을 잡아보려고 한다. 다음은 백준 단계별로 풀어보기 - 그리디 알고리즘 파트의 문제들이다. [11047] 동전 0 - Python /* 문제 */ 준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전..
[11053] 가장 긴 증가하는 부분 수열 - Python
/* 문제 */ 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. dp문제다. dp 리스트의 각 요소에는 해당 수열 값까지 최대로 이어질 수 있는 수열의 길이를 저장한다. 예를 들어 A = {10,20,10,30,20,50}인 경우에는 dp가 [1,2,1,3,2,4]일 것이다. dp의 첫 번째 요소를 1로 설정하고(앞에 다른 수가 없으므로 수열의 길이는 무조건 1) 반복문으로 dp의 인덱스를 1부터 돌며 최대 길이를 계산한다. 반복문에서는 계산 중인 수열의 값보다 작은 값들을 모은 후 ..
[10844] 쉬운 계단 수 - Python
/* 문제 */ 45656이란 수를 보자. 이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다. N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구해보자. 0으로 시작하는 수는 계단수가 아니다. dp 문제다. 우선 N=1일 때부터 생각을 해보면, 길이가 1인 계단 수는 총 9개이다. N=2일 때는 N=1일 때 만들어진 수 뒤에 한 자리를 더 붙이는 것이라고 생각할 수 있다. 앞의 자릿수보다 1 크거나 1 작아야 하므로 N=1일 때의 경우의 수 * 2로 계산할 수 있는데, 앞의 자릿수가 0이거나 9일 경우에는 각각 1, 8 이외의 수는 불가능하다. 따라서 (N=1일 떄의 경우의 수) * 2 - 2로 계산한다. 이 과정을 일반화 해보면 N=i일 때의 경우의 수는 (N=i-1일..
[1463] 1로 만들기 - Python
/* 문제 */ 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다. 1. X가 3으로 나누어 떨어지면, 3으로 나눈다. 2. X가 2로 나누어 떨어지면, 2로 나눈다. 3. 1을 뺀다. 정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오. dp 문제다. 이 문제는 얼핏 쉬워 보이지만 아무 생각 없이 배수로 나눌 경우 최솟값을 제대로 구할 수 없다. 예를 들어 10의 경우, 10 -> 5 -> 4 -> 2 -> 1 로 구하기 쉬운데 (단순 조건문 사용 시) -1을 먼저 해서 10 -> 9 -> 3 -> 1 로 구하는 것이 최솟값이다. 따라서 모든 경우의 수를 구해서 최솟값을 구하는 방법을 생각해 볼 수 있는데, 모든 ..
[1932] 정수 삼각형 - Python
/* 문제 */ 위 그림은 크기가 5인 정수 삼각형의 한 모습이다. 맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다. 삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다. dp 문제다. 각 칸마다 해당 칸에 도착하는 경로들 중 최댓값을 저장한다. 특정 칸에 도착하는 방법은 최대 두 가지 경우밖에 없다. 위에서 아래로 내려온다고 가정했을 때, 왼쪽 위 (단, 현재 칸이 맨 왼쪽 칸이 아니어야 함) 오른쪽 위 (단, ..
[1149] RGB거리 - Python
/* 문제 */ RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다. 집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자. - 1번 집의 색은 2번 집의 색과 같지 않아야 한다. - N번 집의 색은 N-1번 집의 색과 같지 않아야 한다. - i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다. dp문제다. 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어지고 그 비용들의 총합 중 최솟값을 고르는 것이기 때문에, 처음에는 i번째 집을 칠하는데 들어가는 최소 비용을 계속 업데이트하면서 ..