본문 바로가기

프로그래밍/PS

(80)
[C++] 백준 1021번: 회전하는 큐 풀이과정 양방향 순환 큐의 원소의 개수와 뽑을 원소의 개수 int N, M 그리고 뽑을 원소의 위치 deque req를 입력 받는다. 1부터 N까지를 담고 있는 deque arr도 정의해준다. int N, M; deque arr, req; cin >> N >> M; req = deque(M); FOR(i, M) cin >> req[i]; arr = deque(N); FOR(i, N) arr[i] = i + 1; 2와 3의 연산 횟수를 나타내는 int step을 정의하고 작업을 시작한다. 1. 지금 뽑을 원소의 위치를 담을 int target_pos를 정의하고, 그 위치를 저장한다. 2. 그 위치가 arr.size() / 2 보다 작다면 2의 연산을 하는 것이 유리하다. 2-1. arr.front()가 지..
[C++] 백준 15657번: N과 M (8) 아이디어 그냥 백트랙킹... 중복 없애고... 중복 조합.... 풀이 수열을 입력받고 오름차순으로 정렬한 뒤에 중복된 항목을 제거한다. 백트랙킹을 통해 중본 조합을 구한다. 출력한다. 끝. 코드 #include using namespace std; #define FAST_IO cin.tie(NULL); ios::sync_with_stdio(false); #define FOR(i, N) for(int i = 0; i < N; ++i) #define INF 987654321 #define EL "\n" int N, M; vector arr, ret; vector ans; void dfs(int cursor) { if (ret.size() == M) { ans.push_back(ret); return; } f..
[C++] 백준 1010번: 다리 놓기 https://www.acmicpc.net/problem/1010 1010번: 다리 놓기 입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다. www.acmicpc.net 아이디어 정석대로 계산하려면 long long 범위도 초과한다. \(\prod_{i=M-N+1}^{M}{i}\)의 인수 목록에서 \(\prod_{i=1}^{N}{i}\)와의 공통 인수를 제거하여 답을 도출해야 한다. 풀이 \(M-N+1\)부터 \(M\)까지의 각 \(i\) 마다의 인수를 구해 맵에 저장했다. key에는 인수를, value에는 인수의 개수를 저장했다. 이후 \(1\)부터 \(N\)까..
[C++] 백준 1934: 최소공배수 https://www.acmicpc.net/problem/1934 1934번: 최소공배수 두 자연수 A와 B에 대해서, A의 배수이면서 B의 배수인 자연수를 A와 B의 공배수라고 한다. 이런 공배수 중에서 가장 작은 수를 최소공배수라고 한다. 예를 들어, 6과 15의 공배수는 30, 60, 90등이 있 www.acmicpc.net 아이디어 A와 B의 인수를 모두 곱한다. 풀이 A의 인수를 map 형식의 aliquots_A라는 변수에 담았다. key에는 인수를 value에는 그 개수를 저장했다. B에서도 마찬가지로 같은 형식의 aliquots_B라는 변수에 같은 방식으로 저장했다. 2부터 시작하여 A(또는 B)가 1이 될 때까지 나눌 수 있으면 나누는 방식으로 인수를 구했다. 그리고 aliquots_A의 ..
[C++] 백준 1026번: 보물 https://www.acmicpc.net/problem/1026 1026번: 보물 첫째 줄에 N이 주어진다. 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어지고, 셋째 줄에는 B에 있는 수가 순서대로 주어진다. N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거 www.acmicpc.net 아이디어 큰 수와 작은수를 짝지어 곱하면 총 합은 작아진다. 풀이 배열 A는 vector 형식에 담고, B는 vector 형식에 fisrt에는 값을, second에는 인덱스를 담았다. B를 copied라는 벡터에 복사하고 A는 내림차순, copied는 first 기준 오름차순으로 정렬했다. copied의 fisrt 값을 A의 값으로 순서대로 대체하고 copied의 second 기준으로 오름..
[C++] 백준 11053번: 가장 긴 증가하는 부분 수열 문제 바로가기 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 다이나믹 프로그래밍 분류의 문제를 풀다보면 어떤 문제는 금방 풀리고, 어떤 문제는 아무리 생각해보 답이 떠오르지 않는다. 이 문제는 후자에 해당했다. 첫 풀이는 간단했다. 첫 번째 요소부터 시작해서 뒤에 이어지는 값 중 자신보다 큰 값들의 개수를 출력했다. 당현하게도 이는 정답이 아니다. 자신보다 큰 수는 맞지만, 이어지는 수 보다도 큰 수가 선택 돼야 하기 때문이다. 그..
[C++] 백준 10844번: 쉬운 계단 수 문제 바로가기 10844번: 쉬운 계단 수 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net 개요 이 문제는 혼자 골똘히 생각하다가 포기한 문제다. 결국 풀이를 봤는데, 처음에는 이해하지 못 했다. 종이에 여러 번 써보니 이해됐다. 풀이 끝 자리가 0 또는 9일 때는 다음에 붙을 수가 1과 8로 한 가지 밖에 없다. 이외의 수들은 각 2개씩 이어진다. 따라서 각 숫자로 끝나는 수의 개수를 다뤄야 한다. 즉, 단계별 0부터 9까지의 개수를 담는 2차원 배열이 필요하다. 나는 그것을 아래처럼 정의했다. long long C[100][10]{ {0, 1, 1, 1, 1, 1, 1, 1, 1, 1} }; 위 처럼 배열을 정의하면, 값을 지정한 칸을 제외한 남은 ..
[C++] 백준 2156번: 포도주 시식 문제 바로가기 2156번: 포도주 시식 효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규 www.acmicpc.net 개요 대표적인 다이내믹 프로그래밍 분류 문제이다. 문제를 푸는 방법은 점화식을 찾고 구현하는 것. N이 최소일 때부터 손으로 써가며 규칙을 찾는 것이 중요하다. 풀이 N이 1일 때부터의 경우를 차근차근 생각해보자 i번째 잔에 들어있는 포도주의 양을 W[i], i번째 잔까지 마실 수 있는 포도주의 최대값을 S[i]라고 하면 아래와 같이 나타낼 수 있다. N 잔을 선택하는 경우 식 1 ● W[0] 2 ● ● W[0] + W[1] 3 ● ● ○ S[i -..