본문 바로가기

전체 글137

백준 s3 15650 N과 M (2) c++ https://acmicpc.net/problem/15650 15650번: N과 M (2) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해 www.acmicpc.net 코드 - 재귀로 푼 버전 /*boj s3 15650 N과 M (2)*/ #include #define MAXN 9 using namespace std; int N, M; int answer[MAXN]; void func(int k, int i) { // i부터 시작 if (k == M) { for (int i = 0; i < M; i++) { cout M; func(0, 1); } 코드 - next_p.. 2024. 1. 15.
백준 s2 1182 부분수열의 합 c++ https://www.acmicpc.net/problem/1182 풀이 1. 1+3+2나 1+2+3이나 동일하므로, 중복되지 않도록 하였다. 2. S=3 일 때, 1+2로 S 조건을 충족해도 1+2+(-2)+(-1) 이나 0을 더하는 등 조건을 만족하는 부분수열이 더 있을 수도 있기 때문에 return으로 끝내지 않고 더 가야 한다 3. S=0 일 때, func(0)에서 맨 처음 시작이 0이기 때문에 최종 answer에서 -1 해줘야 한다. 수도 코드 func (int i) { //i번째 인덱스부터 시작 if (sum == S) answer++; for(j: i+1 ~ N-1) sum += arr[j] func(j+1) sum -= arr[j] } 코드 /*boj s2 1182 부분수열의 합*/ #inc.. 2024. 1. 15.
백준 g4 9663 N-Queen c++ https://www.acmicpc.net/problem/9663 수도 코드 func (int i) { // i번째 행에 퀸을 둘 차례 (i: 0 ~ N-1) if (i == M) answer++; return; for(j: 0 ~ N-1) { if (열, 우상향 대각선, 좌상향 대각선에 없을 때) isused 표시 func(i+1( isused 표시했던 거 되돌리기 } } 코드 /*boj g4 9663 N-Queen*/ #include #define MAXN 16 using namespace std; int N; bool isused1[MAXN]; bool isused2[2 * MAXN]; bool isused3[2 * MAXN]; int answer; void func(int i) { // i번째 행.. 2024. 1. 15.
백준 s3 15649 N과 M (1) c++ https://www.acmicpc.net/problem/15649 /*boj s3 15649 N과 M (1)*/ #include #define MAXN 9 using namespace std; int N, M; int answer[MAXN]; bool isUsed[MAXN]; void func(int k) { if (k == M) { for (int i = 0; i < M; i++) { cout M; func(0); } next_permutation 쓴 경우 do { 순열 출력 } while(next_permutation(arr, arr+n); /*s3 15649 N과M(1)_next_perm*/ #include #define MAX 10 using namespace std; int n, m; int .. 2024. 1. 15.
백준 g5 2448 별 찍기 - 11 c++ https://www.acmicpc.net/problem/2448 2448번: 별 찍기 - 11 첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수) www.acmicpc.net 풀이 별 찍기 - 10(https://kyj0032.tistory.com/16) 과 비슷하게 풀었다. f(n) : 크기가 n인 삼각형 출력 g(n, r) : 크기가 n인 삼각형의 r번째 줄 출력 N==3 ..*.. 2024. 1. 13.
백준 2447 g5 별 찍기 - 10 c++ https://www.acmicpc.net/problem/2447 2447번: 별 찍기 - 10 재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 www.acmicpc.net 풀이 그냥 재귀로 찍으면 되는 것이 아니라, 프린터처럼 한 줄씩 찍어야하기 때문에 \n 개행 처리가 복잡하다. 어쨌거나 한 줄마다 찍어야 하므로, 한 줄 단위로 재귀적으로 생각해봤다 N=3 일 때, *** g(3, 2) * 3개 // *** *** *** 4번째 줄 -> g(3, 0), 공백*3, g(3, 0) 5번째 줄 -> g(3, 1), 공백*3, g(3, 1) 6.. 2024. 1. 13.
백준 s1 1074 Z c++ https://www.acmicpc.net/problem/1074 1074번: Z 한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. N > 1인 경우, 배열을 www.acmicpc.net 풀이 처음에는 cnt를 두고 한 칸씩 이동하면서 r, c를 찾으려고 하였으나 시간초과가 떴다. 생각해보면 전체 board를 4등분하고 찾으려는 위치가 한 곳에 속하면 나머지는 어차피 2^(N-1)의 제곱 크기만큼 차지하므로, 나머지의 순서는 구할 필요가 없다. 수도코드 N == 3 일 때를 예시로 작성했다 func(n, r, c) if 1번 부분에 속하면 return func(n-1, r.. 2024. 1. 13.
백준 g5 11729 하노이 탑 이동 순서 c++ https://www.acmicpc.net/problem/11729 11729번: 하노이 탑 이동 순서 세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로 www.acmicpc.net 풀이 이해할 수 있는 가장 쉬운 방법은 최소 가능 횟수로 원판 3, 4, 5개를 플레이해보는 걸 추천한다. 풀다보면 규칙이 보임 원판 개수를 n개라고 하고, 원판이 있는 곳을 시작점, 원판을 옮겨야 할 곳을 도착점, 남는 하나를 여분 막대라고 하겠다. 1. 맨 밑 판을 옮기기 위해서 그 위에 있는 n-1개의 판들을 시작점 -> 여분 막대로 옮겨야 한다. 2. 맨 밑 판을 시작점 -> .. 2024. 1. 13.
백준 s1 1629 곱셈 c++ https://www.acmicpc.net/problem/1629 1629번: 곱셈 첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다. www.acmicpc.net 풀이 시간 제한이 0.5초라 그냥 a*func(a-1)은 시간 초과가 걸릴 수 있다. A^B % C = A^(B/2) % C * A^(B/2) % C로 나뉘어질 수 있고 이렇게 하면 log 시간 복잡도가 되기 때문에 괜찮아 보인다. 수도 코드 func (a, b, c) if (b == 1) return a % c else return func(a, b/2, c)^2 코드 /*boj s1 1629 곱셈*/ #include #define MAXN 105 using .. 2024. 1. 13.