본문 바로가기

알고리즘98

백준 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.
백준 g1 9328 열쇠 c++ https://www.acmicpc.net/problem/9328 9328번: 열쇠 상근이는 1층 빌딩에 침입해 매우 중요한 문서를 훔쳐오려고 한다. 상근이가 가지고 있는 평면도에는 문서의 위치가 모두 나타나 있다. 빌딩의 문은 모두 잠겨있기 때문에, 문을 열려면 열쇠가 www.acmicpc.net 문제 간단히 설명 input 맵에 벽, 대문자(자물쇠), 소문자(열쇠), $(먹어야 할 문서) 갖고 있는 열쇠 output 최대로 먹을 수 있는 문서의 개수 대문자 자물쇠는 소문자 열쇠로 열 수 있음 출발점은 건물 가장자리 아무데나 풀이 1. 갖고 있는 열쇠로 열 수 있는 곳은 모두 뚫어놓기 2. bfs로 건물 안 열쇠&문서 주워먹기 1~2를 반복한다. 다만 1) 새로운 열쇠를 먹었을 때만 && 새로운 공간이.. 2024. 1. 13.
백준 g1 16933 벽 부수고 이동하기 3 c++ https://www.acmicpc.net/problem/16933 16933번: 벽 부수고 이동하기 3 첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000), K(1 ≤ K ≤ 10)이 주어진다. 다음 N개의 줄에 M개의 숫자로 맵이 주어진다. (1, 1)과 (N, M)은 항상 0이라고 가정하자. www.acmicpc.net 풀이 벽 부수고 이동하기 2(https://kyj0032.tistory.com/10)와 달라진 점은 낮과 밤이 생기고, 낮일 때만 벽을 부술 수 있다는 것이다. if 다음 위치가 벽이 아닐 때 평소처럼 bfs else if 다음 위치가 벽일 때 if 현재 시간이 낮이면 -> 벽 부수고 다음 위치로 이동 else if 현재 시간이 밤이면 -> 현재 위치에서 낮까지.. 2024. 1. 12.
백준 g3 14442 벽 부수고 이동하기 2 c++ https://www.acmicpc.net/problem/14442 런타임 에러는 함수가 int를 반환해야 하는데 아무것도 반환하지 않아서 생긴 에러 풀이 bfs를 돌릴 때, 자신이 부순 벽 개수랑 같이 이동한다. 이때 vis 배열을 2차원으로 두면 벽 부수고 이동한 거리 3 vs 벽 안 부수고 이동한 거리 5 둘 중 뭘 남길건지 애매해지기 때문에 dp처럼 모두 기록할 수 있도록 [n, m, 벽 부순 횟수] 3차원 배열로 둬야 한다. BFS 만약 다음 위치가 벽이 아니면, 그대로 BFS 다음 위치가 벽이면, vis[nx, ny, k+1]이 방문 되었는지 k+1가 K를 넘지 않는지 체크 후 기록 /*boj g3 14442 벽 부수고 이동하기 2*/ #include #include #include #defi.. 2024. 1. 12.