Python
[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번째 집을 칠하는데 들어가는 최소 비용을 계속 업데이트하면서 ..
[2579] 계단 오르기 -Python
/* 문제 */ 계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. 과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점수를 얻게 된다. 예를 들어 와 같이 시작점에서부터 첫 번째, 두 번째, 네 번째, 여섯 번째 계단을 밟아 도착점에 도달하면 총 점수는 10 + 20 + 25 + 20 = 75점이 된다. 계단 오르는 데는 다음과 같은 규칙이 있다. 계단은 한 번에 한 계단씩 또는 두 계단씩 오를 수 있다. 즉, 한 계단을 밟으면서 이어서 다음 계단이나, 다음 다음 계단으로 오를 수 있다.연속된 세 개의 계단을 모두 밟아서는 안 된다. 단, 시작점은 계단에 포함되지 않는다.마지막 도착 계단은 반드시 밟아야 한다. 따라서 첫 번째 ..
[1912] 연속합 - Python
Dynamic Programming(DP, 동적 계획법)은 하나의 큰 문제를 여러 개의 작은 문제로 나누어서 푸는 방법이다. 포인트는 중복되는 작은 문제들의 결과를 저장해 놓고 재활용하는 것이다. DP라는 이름때문에 어떤 방법인지 한 번에 알기 어려운데, '기억하며 풀기'라고도 하고 '하나의 문제는 단 한 번만 풀도록 하는 알고리즘'으로 정리할 수도 있다. 1912번 문제는 DP를 활용하여 풀 수 있다. /* 문제 */ n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 수는 한 개 이상 선택해야 한다. 예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하..
[1018] 체스판 다시 칠하기 - Python
문제 지민이는 자신의 저택에서 MN개의 단위 정사각형으로 나누어져 있는 M×N 크기의 보드를 찾았다. 어떤 정사각형은 검은색으로 칠해져 있고, 나머지는 흰색으로 칠해져 있다. 지민이는 이 보드를 잘라서 8×8 크기의 체스판으로 만들려고 한다. 체스판은 검은색과 흰색이 번갈아서 칠해져 있어야 한다. 구체적으로, 각 칸이 검은색과 흰색 중 하나로 색칠되어 있고, 변을 공유하는 두 개의 사각형은 다른 색으로 칠해져 있어야 한다. 따라서 이 정의를 따르면 체스판을 색칠하는 경우는 두 가지뿐이다. 하나는 맨 왼쪽 위 칸이 흰색인 경우, 하나는 검은색인 경우이다. 보드가 체스판처럼 칠해져 있다는 보장이 없어서, 지민이는 8×8 크기의 체스판으로 잘라낸 후에 몇 개의 정사각형을 다시 칠해야겠다고 생각했다. 당연히 8..
[1004] 어린 왕자 - Python
문제 어린 왕자는 소혹성 B-664에서 자신이 사랑하는 한 송이 장미를 위해 살아간다. 어느 날 장미가 위험에 빠지게 된 것을 알게 된 어린 왕자는, 장미를 구하기 위해 은하수를 따라 긴 여행을 하기 시작했다. 하지만 어린 왕자의 우주선은 그렇게 좋지 않아서 행성계 간의 이동을 최대한 피해서 여행해야 한다. 아래의 그림은 어린 왕자가 펼쳐본 은하수 지도의 일부이다. 빨간 실선은 어린 왕자가 출발점에서 도착점까지 도달하는데 있어서 필요한 행성계 진입/이탈 횟수를 최소화하는 경로이며, 원은 행성계의 경계를 의미한다. 이러한 경로는 여러 개 존재할 수 있지만 적어도 3번의 행성계 진입/이탈이 필요하다는 것을 알 수 있다. 위와 같은 은하수 지도, 출발점, 도착점이 주어졌을 때 어린 왕자에게 필요한 최소의 행성..