목록C,C++ (125)
오답노트
https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net - 문제 파악 주어진 수열에서 부분적으로 제거 하여 증가하는 수열을 만들 때 가장 긴 수열의 길이를 출력하라 - 나의 접근 1. 0부터 N까지 주어진 배열을 확인하며, arr[i] 와 가장 차이가 적게 나는 배열을 찾아 거기에 arr[i]+1 값을 넣도록 했다. -> 경우의 수를 너무 좁혀서 다 안찾아지는 그런 경우가 ..
https://www.acmicpc.net/problem/10844 10844번: 쉬운 계단 수 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net - 문제 파악 이웃한 자리수의 숫자의 차가 1인 수를 계단 수라고 한다. 정수 N이 주어졌을 때, N자리 계단 수를 만들 경우의 수를 구하여라. (0으로 시작하는 계단수는 없음, 0 이전의 수는 없음, 9 다음의 수는 없음) - 나의 접근 N 자리일때 2^(N-1)의 경우가 생기는데 여기서 위와 같은 경우를 빼는 식으로 접근 배열로 안풀려도 풀릴거 같아서 위와 같은 방법으로 접근 했지만 DP 는 배열을 선언해야한다. - 정답 D[i][j] 는 i 번째 자리에 j 가 오는 경우 D[i][j] 는 D[i][j-1]..
https://www.acmicpc.net/problem/15990 15990번: 1, 2, 3 더하기 5 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다. www.acmicpc.net - 문제 파악 정수 N과 N개의 정수가 주어진다. 각각의 정수를 1,2,3의 합으로 나타낼 수 있는 경우의 수를 출력하라. 단, 1,2,3 중 1개 이상의 숫자를 써야하고 연속해서 사용할 수 없다. - 나의 접근 시간복잡도를 신경안쓰고 일단 초항으로 1, 2, 3을 먼저 초기화하고 4부터 for문을 돌리도록 했는데 초항에 대한 문자열을 초기화하여 무식하게 앞뒤로 붙혀가면서 연속되면 경우의 수에서 제외 해버리는 알고리즘으로 접근했으나, 예상대로 시간..
https://www.acmicpc.net/problem/16194 16194번: 카드 구매하기 2 첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000) www.acmicpc.net - 문제 파악 정수 N과 정수 P1~Pn이 주어진다. P1~ Pn를 적절히 조합하여 N을 만드는 경우의 수중에서 Pi 요소의 합이 최소값을 출력하라. -정답 https://dhjkl123.tistory.com/54 [DP] BOJ 11052 카드 구매하기 https://www.acmicpc.net/problem/11052 11052번: 카드 구매하기 첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이..
https://www.acmicpc.net/problem/11052 11052번: 카드 구매하기 첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000) www.acmicpc.net - 문제 파악 정수 N 과 P1~PN 의 정수가 주어진다. 1~N 을 적절히 조합하여 N을 만드는 수의 조합에서 Pi들의 합이 최대값을 출력하라. -정답 1. 경우의 수 모든 경우의 수를 살펴 보지 않고 D[i-1] + D[1]만 확인했었다. 점화식을 찾는 도중 D[i-1] + D[1] = D[i-2] + D[2] 를 찾았고, 시간 초과를 염려해서 2중for문을 기피하려고 했다. 하지만 위 점화식은 여러..
가끔 쓰는데가 있어서 여따 올린다 unsigned long long func(int a, int b) { int nChoose = 0, kChoose = 0; unsigned long long p = 1, q = 1; if (b == 0 || a == b) return 1; if (a - b > b) { nChoose = a - b; kChoose = b; } else { kChoose = a - b; nChoose = b; } //nCk or nCn-k for (int j = 1; j = j) q *= j; // k! } return p / q; }
https://www.acmicpc.net/problem/11727 11727번: 2×n 타일링 2 2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다. www.acmicpc.net - 문제 파악 정수 N 이 주어지고 1x2 , 2x1 , 2x2 타일로 N을 채우는 경우의 수 출력 - 나의 접근 조합 알고리즘으로 접근해서 예제는 맞았지만 1000이 틀렸다. 이전에 11726번을 풀다가 틀렸음에도 뭔 자신감인지 복습 안하고 풀었다가 당했다. 그때랑 비슷하게 당한거 같은데.. 앞으로는 이렇게 풀자.. 다이나믹 프로그래밍(DP)은 점화식이다.. -정답 #include "bits/stdc++.h" using na..
https://www.acmicpc.net/problem/1182 1182번: 부분수열의 합 첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다. www.acmicpc.net - 문제 파악 정수 두개와 첫번째 정수 크기만큼의 수열을 입력한다. 입력된 수열을 조합하여 만든 수열의 합이 두번째 수열이 되는 경우의 수를 출력하라. 중복은 없다. - 나의 풀이 백트래킹으로 풀면 된다고 생각했으나, 중복문제 그리고 시간 초과로 인해서 제대로된 결과를 얻을 수 없었다. 아래 정답은 재귀를 활용한 코드인데, 아이디어가 괜찮은것 같다. 일반적인 백..
https://www.acmicpc.net/problem/11723 11723번: 집합 첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다. 둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다. www.acmicpc.net - 문제 파악 공집합 S가 있고 문자열과 정수가 입력되면 그에 맞는 기능을 실행하고 check가 입력되면 같이 입력된 정수의 상태를 출력한다. - 정답 비트마스크 문제이지만 배열로 풀었다. #include "bits/stdc++.h" using namespace std; int arr[22]; int ans = 0x7ffffff; int main() { cin.tie(NULL); ios::sync_with_stdio(false); ..
https://www.acmicpc.net/problem/10971 10971번: 외판원 순회 2 첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 10) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j www.acmicpc.net - 문제 파악 정수 N 과 NxN의 2차원 배열이 주어진다. i->j 에서 가는 비용은 2차원의 배열에서 [i][j]의 원소값과 같다. 0부터 N-1 까지 순회하는데 비용의 최소값을 출력하라. - 정답 N-1 에서 0으로 돌아오는 것도 계산해야한다. #include "bits/stdc++.h" using namespace std; int arr[11][..