728x90
반응형

백준 87

[백준/재귀/C++] 2003번 수들의합2

https://www.acmicpc.net/problem/2003 2003번: 수들의 합 2 첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다. www.acmicpc.net #include using namespace std; int n, m; int arr[10001]; int result = 0; void solve(int index, int tot){ // 시작 인덱스, 원소 합 if(index>n) return; if(tot == m){ result++; return; } solve(index+1, tot+arr[ind..

알고리즘 2023.01.11

[백준/BFS/C++] 1697번 숨바꼭질 *

https://www.acmicpc.net/problem/1697 1697번: 숨바꼭질 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 www.acmicpc.net #include using namespace std; const int MAX = 100001; int n, k; bool visited[MAX]; int path[MAX]; queue q; void bfs(int v){ path[v] = 0; visited[v] = true; q.push(v); while(!q.empty()){ int w = q.front(); if(..

알고리즘 2023.01.10

[백준/백트래킹/C++] 10971번 외판원 순회2 *

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 #include using namespace std; int n; bool ch[11]; int ans = 1e9; int w[10][10]; void go(int start, int index, int cnt, int sum) { // 최초 출발지점, 현재 위치, 지나간 마을수, 이동비용 if(cnt == n){ if(w[index][start] ==..

알고리즘 2023.01.10

[백준/백트래킹/C++] 6603번 로또

https://www.acmicpc.net/problem/6603 6603번: 로또 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로 www.acmicpc.net #include using namespace std; int k; int num[50], arr[50]; bool isused[50]; void backtrack(int k, int n){ if(k==6){ bool flag = true; int tmp = -1; for(int i=0; i arr[i]) flag = false; tmp = arr[i]; } if(flag){ for(in..

알고리즘 2023.01.09

[백준/백트래킹/C++] 15652번 N과 M (4)

https://www.acmicpc.net/problem/15652 15652번: N과 M (4) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해 www.acmicpc.net #include using namespace std; int n, m; int arr[8]; void backtrack(int k){ if(k==m){ for(int i=0; i

알고리즘 2023.01.08

[백준/백트래킹/C++] 15651번 N과 M (3)

https://www.acmicpc.net/problem/15651 15651번: N과 M (3) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해 www.acmicpc.net #include using namespace std; int n, m; int arr[8]; void backtrack(int k){ if(k==m){ for(int i=0; i

알고리즘 2023.01.08

[백준/백트래킹/C++] 15650번 N과 M (2) (조합)

https://www.acmicpc.net/problem/15650 15650번: N과 M (2) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해 www.acmicpc.net #include using namespace std; int n, m; int arr[9]; bool isused[9]; void backtrack(int k){ // 현재 k개 까지 수를 택했음 if(k==m){ for(int i=0; i> n >> m; // m의 개수만큼 0을 넣어줌 for(int i=0; i

알고리즘 2023.01.08

[백준/백트래킹/C++] 1182번 부분수열의 합

https://www.acmicpc.net/problem/1182 1182번: 부분수열의 합 첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다. www.acmicpc.net 문제 해결 방법 k를 차례로 증가시키면서 k번째 원소를 합하거나 합하지 않는 두가지 경우로 백트래킹을 한다 #include using namespace std; int n, s; int arr[21]; int result = 0; void backtrack(int k, int tot){ if(k == n){ if(tot == s) result++; return;..

알고리즘 2023.01.07

[백준/백트래킹/C++] 9663번 N-Queen

https://www.acmicpc.net/problem/9663 9663번: N-Queen N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오. www.acmicpc.net 문제 해결 방법 백트래킹을 사용하여 풀수있다 퀸은 상, 하, 좌, 우, 대각선으로 움질일 수 있고 시간을 줄이기 위해 세가지 조건을 검사할 수 있다 우선 퀸이 좌우로 움질일 수 있기 때문에 한 행에는 하나의 퀸 만 놓을 수 있다는 것을 전제로 두고 시작한다 1번 조건 (상하로 움직일 수 있기 때문에 같은 열에 있는지 확인하는 조건) : i의 값이 같으면 continue 해준다 2번 조건 ( / 모양 대각선 위에 ..

알고리즘 2023.01.07
728x90
반응형