본문 바로가기

분류 전체보기135

다이나믹 프로그래밍 이론 다이나믹 프로그래밍이란 일반적인 알고리즘 문제를 더 빠르게 해결하기 위해 생긴 기법이다. 다이나믹 프로그래밍은 다음 두 가지 조건을 만족할 때 사용 가능하다. 최적 부분 구조 큰 문제를 작은 문제로 나누고, 작은 문제들의 답을 모아 큰 문제를 해결할 수 있다. 중복되는 부분 문제 동일한 작은 문제들이 반복된다. 이렇게 얘기한다면 크게 와닿지 않는다. 재귀함수의 기본인 피보나치 수열을 예시로 들어보겠다. def fibo(n): if (n == 1 or n == 2): return 1 return (fibo(n - 1) + fibo(n - 2)) 피보나치 수열 함수는 다음과 같이 작성할 수 있다. 이 부분을 잘 모르겠다면 재귀함수를 공부해야한다. 위의 함수를 이용해 f(6)을 구하고자 한다면 그 함수는 f(.. 2023. 2. 21.
[백준] 12015번 가장 긴 증가하는 부분 수열 2 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/12015 도저히 구상할 수가 없어서 다른 코드를 참고하였다. 다른 코드를 보아도 왜 그런지 원리를 정확히 이해하는 것은 너무 어려웠다. 알고리즘을 적용시키는 스킬을 늘려주는 문제이다. [문제] 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. [입력] 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 .. 2023. 2. 17.
찜닭 닭다리살을 순살로 2키로를 구매했다. 닭다리살을 산 기념으로 찜닭에 도전해 보았다! 자취요리 박무땡님의 콜라찜닭 영상을 참고하였다. 재료 닭다리살 한덩이(200g?), 당근 1/3개, 양파 1/2개, 감자 1개 양념 : 콜라(닭이 2/3 잠길 만큼), 간장 3, 굴소스 2 레시피 1. 해동시킨 닭다리살을 살짝 삶는다. 불순물 및 잡내 제거 2. 살짝 겉이 익었다 싶으면 물을 다 버리고 닭을 자른다. 나는 크게 잘랐는데 먹기 좋게 한입 크기로 자르는 게 더 나을 듯 3. 콜라를 닭이 2/3 정도 잠길 만큼만 넣고 끓인다. 이때 간장과 굴소스를 넣는다. 콜라는 단맛과 색감용도이므로, 콜라가 없다면 설탕, 물엿, 올리고당 등으로 대체 가능 3. 6~7분 후에 야채를 넣으라고 했지만, 나는 순살로 하므로 4~5.. 2023. 2. 17.
[백준] 1300번 K번째 수 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/1300 '의외로 이분 탐색으로 풀 수 있는 놀라운 문제 1'라고 설명되는 문제이다. 실제로 그랬다. 구상이 상당히 어려웠다. 처음 보았을 땐 이분탐색 알고리즘으로 푸는 방법이 전혀 생각나지 않았다. 구상이 어려워 다른 풀이를 조금 참고하여 풀었다. [문제] 세준이는 크기가 N×N인 배열 A를 만들었다. 배열에 들어있는 수 A[i][j] = i×j 이다. 이 수를 일차원 배열 B에 넣으면 B의 크기는 N×N이 된다. B를 오름차순 정렬했을 때, B[k]를 구해보자. 배열 A와 B의 인덱스는 1부터 시작한다. [입력] 첫째 줄에 배열의 크기 N이 주어진다. N은 10^5보다 작거나 같은 자.. 2023. 2. 16.
[백준] 2110번 공유기 설치 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/2110 이분 탐색 문제인 것을 알고 푸니까 쉽게 보였지만, 모르고 푼다면 구상하기에 꽤 어려울 것 같은 문제이다. [문제] 도현이의 집 N개가 수직선 위에 있다. 각각의 집의 좌표는 x_1, ..., x_N이고, 집 여러개가 같은 좌표를 가지는 일은 없다. 도현이는 언제 어디서나 와이파이를 즐기기 위해서 집에 공유기 C개를 설치하려고 한다. 최대한 많은 곳에서 와이파이를 사용하려고 하기 때문에, 한 집에는 공유기를 하나만 설치할 수 있고, 가장 인접한 두 공유기 사이의 거리를 가능한 크게 하여 설치하려고 한다. C개의 공유기를 N개의 집에 적당히 설치해서, 가장 인접한 두 공유기 사이.. 2023. 2. 15.
[백준] 1654번 랜선 자르기 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/1654 어렵지 않은 이분 탐색 문제였다. [문제] 집에서 시간을 보내던 오영식은 박성원의 부름을 받고 급히 달려왔다. 박성원이 캠프 때 쓸 N개의 랜선을 만들어야 하는데 너무 바빠서 영식이에게 도움을 청했다. 이미 오영식은 자체적으로 K개의 랜선을 가지고 있다. 그러나 K개의 랜선은 길이가 제각각이다. 박성원은 랜선을 모두 N개의 같은 길이의 랜선으로 만들고 싶었기 때문에 K개의 랜선을 잘라서 만들어야 한다. 예를 들어 300cm 짜리 랜선에서 140cm 짜리 랜선을 두 개 잘라내면 20cm는 버려야 한다. (이미 자른 랜선은 붙일 수 없다.) 편의를 위해 랜선을 자르거나 만들 때 손실되.. 2023. 2. 15.
[백준] 10816번 숫자 찾기 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/10816 이분 탐색을 이용한 문제이다. [문제] 숫자 카드는 정수 하나가 적혀 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오. [입력] 첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이.. 2023. 2. 15.
[백준] 1920번 수 찾기 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/1920 쉬운 이분 탐색 문제였다. [문제] N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오. [입력] 첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안에 존재하는지 알아내면 된다. 모든 정수의 범위는 -2^31 보다 크거나 같고 2^31보다 작다. [출력] M개의 줄에 답을 출력한다. 존재하면 1을, 존재하.. 2023. 2. 14.
이진 탐색 - 정렬된 배열에서 특정 수의 개수 구하기 [문제] N개의 원소를 포함하고 있는 수열이 오름차순으로 정렬되어 있습니다. 이때 이 수열에서 x가 등장하는 횟수를 계산하세요. 예를 들어 수열 {1,1,2,2,2,2,3}이 있을 때 x = 2라면, 현재 수열에서 값이 2인 원소가 4개이므로 4를 출력합니다. 단, 이 문제는 시간 복잡도 O(logN)으로 알고리즘을 설계하지 않으면 '시간 초과' 판정을 받습니다. [입력] 첫째 줄에 N과 x가 정수 형태로 공백으로 구분되어 입력됩니다. (1 2023. 2. 14.