BAEKJOON/알고리즘 23

[BOJ] 1010번 : 다리 놓기

🔒 문제 ⌨ 입력 🖨 출력 📚 예제 📌 풀이 이 문제는 조합을 사용해서 풀었다. 고등학교 확률과 통계 조합 단원에서, 집합 X에서 집합 Y로의 함수를 정의 할 때 조건 x1 < x2 이면, f(x1) < f(x2)를 만족하는 함수의 개수를 구하는 문제가 있다. 이 다리 놓기 문제는 다리 끼리 겹쳐지는 상황이 생기면 안되기 때문에 위의 그림에 적어놓은 것 처럼 저 조건을 사용해서 조합으로 풀 수 있다. 🔑 python 코드 #다리 놓기 import sys input = sys.stdin.readline T = int(input()) arr = [[int(i) for i in input().split()]for _ in range(T)] #조합 def nCr(n, m): ans = 1 d = 1 for i ..

[BOJ] 10775번 : 공항

🔒 문제 오늘은 신승원의 생일이다. 박승원은 생일을 맞아 신승원에게 인천국제공항을 선물로 줬다. 공항에는 G개의 게이트가 있으며 각각은 1에서 G까지의 번호를 가지고 있다. 공항에는 P개의 비행기가 순서대로 도착할 예정이며, 당신은 i번째 비행기를 1번부터 gi (1 ≤ gi ≤ G) 번째 게이트중 하나에 영구적으로 도킹하려 한다. 비행기가 어느 게이트에도 도킹할 수 없다면 공항이 폐쇄되고, 이후 어떤 비행기도 도착할 수 없다. 신승원은 가장 많은 비행기를 공항에 도킹시켜서 박승원을 행복하게 하고 싶어한다. 승원이는 비행기를 최대 몇 대 도킹시킬 수 있는가? ⌨ 입력 첫 번째 줄에는 게이트의 수 G (1 ≤ G ≤ 105)가 주어진다. 두 번째 줄에는 비행기의 수 P (1 ≤ P ≤ 105)가 주어진다...

[BOJ] 1715번 : 카드 정렬하기

🔒 문제 정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장의 숫자 카드 묶음을 합치려면 50번의 비교가 필요하다. 매우 많은 숫자 카드 묶음이 책상 위에 놓여 있다. 이들을 두 묶음씩 골라 서로 합쳐나간다면, 고르는 순서에 따라서 비교 횟수가 매우 달라진다. 예를 들어 10장, 20장, 40장의 묶음이 있다면 10장과 20장을 합친 뒤, 합친 30장 묶음과 40장을 합친다면 (10 + 20) + (30 + 40) = 100번의 비교가 필요하다. 그러나 10장과 40장을 합친 뒤, 합친 50장 묶음과 20장을 합친다면 (10 + 40) + (50 + 2..

[BOJ] 1092번 : 배

🔒 문제 지민이는 항구에서 일한다. 그리고 화물을 배에 실어야 한다. 모든 화물은 박스에 안에 넣어져 있다. 항구에는 크레인이 N대 있고, 1분에 박스를 하나씩 배에 실을 수 있다. 모든 크레인은 동시에 움직인다. 각 크레인은 무게 제한이 있다. 이 무게 제한보다 무거운 박스는 크레인으로 움직일 수 없다. 모든 박스를 배로 옮기는데 드는 시간의 최솟값을 구하는 프로그램을 작성하시오. ⌨ 입력 첫째 줄에 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 각 크레인의 무게 제한이 주어진다. 이 값은 1,000,000보다 작거나 같다. 셋째 줄에는 박스의 수 M이 주어진다. M은 10,000보다 작거나 같은 자연수이다. 넷째 줄에는 각 박스의 무게가 주어진다. 이 값도 1,000,000보다 ..

[BOJ] 2631번 : 줄세우기

문제 바로가기 => 줄세우기 🔒 문제 KOI 어린이집에는 N명의 아이들이 있다. 오늘은 소풍을 가는 날이다. 선생님은 1번부터 N번까지 번호가 적혀있는 번호표를 아이들의 가슴에 붙여주었다. 선생님은 아이들을 효과적으로 보호하기 위해 목적지까지 번호순서대로 일렬로 서서 걸어가도록 하였다. 이동 도중에 보니 아이들의 번호순서가 바뀌었다. 그래서 선생님은 다시 번호 순서대로 줄을 세우기 위해서 아이들의 위치를 옮기려고 한다. 그리고 아이들이 혼란스러워하지 않도록 하기 위해 위치를 옮기는 아이들의 수를 최소로 하려고 한다. 예를 들어, 7명의 아이들이 다음과 같은 순서대로 줄을 서 있다고 하자. 3 7 5 2 6 1 4 아이들을 순서대로 줄을 세우기 위해, 먼저 4번 아이를 7번 아이의 뒤로 옮겨보자. 그러면 ..

[BOJ] 9251번 : LCS

문제 바로가기 => LCS 🔒 문제 LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다. ⌨ 입력 첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다. 🖨 출력 첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다. 📚 예제 Ex) ACAYKP CAPCAK 4 📌 풀이 arr1과 arr2에 각각 문자열을 저장해준다. arr1의 문자열 길이를 n, arr2의 문자열 길이를 m으로 둔다. 조심해야할 점은 &#39;\n&#39;까지 문자열로 ..

[BOJ] 11053번 : 가장 긴 증가하는 부분 수열

문제 바로가기 => 가장 긴 증가하는 부분 수열 🔒 문제 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. ⌨ 입력 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000) 🖨 출력 첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다. 📚 예제 6 10 20 10 30 20 50 Ex) 4 📌 풀이 1번 풀이 (O(n^2)) *dp[ N ] = 0 ~ N - 1 인덱스에 저..

[BOJ] 1562번 : 계단 수

🔒 문제 45656이란 수를 보자. 이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다. N이 주어질 때, 길이가 N이면서 0부터 9까지 숫자가 모두 등장하는 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. 0으로 시작하는 수는 계단수가 아니다. ⌨ 입력 첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다. 🖨 출력 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. 📚 예제 Ex) 10 1 📌 풀이 쉬운 계단 수의 심화 버전인것 같다. 어떻게 풀어야할 지 많은 고민을 했는데 비트마스킹을 사용하니까 쉽게 풀렸다. dp[계단 수][일의 자리 수][0~9 중 어떤 수들 사용했는 지] 로 행렬을 만든다. 2차원 배열을 사용..

[BOJ] 10844번 : 쉬운 계단 수

🔒 문제 45656이란 수를 보자. 이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다. N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구해보자. 0으로 시작하는 수는 계단수가 아니다. ⌨ 입력 첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다. 🖨 출력 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. 📚 예제 Ex1) 1 9 Ex2) 2 17 📌 풀이 dp[계단 수][일의 자리 수] 로 행렬을 만든다. 행렬에는 각 인덱스 별 만들 수 있는 계단 수를 저장한다. dp[n][m]으로 가정하자. N == 1 일 때 n == 0 일 때, m이 0인 경우를 제외하고는 모두 1이다. m이 0인 경우는 0이다. (0으로 ..

[BOJ] 1149번 : RGB거리 (Python)

🔒 문제 RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다. 집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자. 1번 집의 색은 2번 집의 색과 같지 않아야 한다. N번 집의 색은 N-1번 집의 색과 같지 않아야 한다. i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다. ⌨ 입력 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,00..