분할정복 9

Baekjoon Online Judge 4256번 파이썬. 분할정복.

문제 링크 https://www.acmicpc.net/problem/4256 4256번: 트리 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 노드의 개수 n이 주어진다. (1 ≤ n ≤ 1,000) BT의 모든 노드에는 1부터 n까지 서로 다른 번호가 매겨져 있다. 다음 www.acmicpc.net 전위순회한 결과의 맨 앞 노드는 전체 트리의 루트이다. 중위순회한 결과에서 전체 트리의 루트를 기준으로 왼쪽은 왼쪽 서브트리이고, 오른쪽은 오른쪽 서브트리이다. 후위순회는 왼쪽, 오른쪽, 루트 순으로 출력하는 것이다. 그래서 전체 트리의 루트(root)를 기준으로 왼쪽 먼저 함수를 실행하고, 다음으로 오른쪽을 실행한다. 그리고 마지막에 root를 출력한다. 정답 코드 impo..

Baekjoon Online Judge 17829번 파이썬. 분할정복.

문제링크 https://www.acmicpc.net/problem/17829 17829번: 222-풀링 조기 졸업을 꿈꾸는 종욱이는 요즘 핫한 딥러닝을 공부하던 중, 이미지 처리에 흔히 쓰이는 합성곱 신경망(Convolutional Neural Network, CNN)의 풀링 연산에 영감을 받아 자신만의 풀링을 만들고 이를 22 www.acmicpc.net 'divide=size//2'로 정사각형을 4등분을 할 수 있도록 하였다. 그리고 dnc함수에서 lefttop,righttop,leftbottom,rightbottom으로 나누어 진행될 수 있도록 하였다. 정답코드 import sys N = int(sys.stdin.readline()) nums = [] for i in range(N): nums.ap..

Baekjoon Online Judge 2448번 파이썬. 분할 정복.

문제 링크 https://www.acmicpc.net/problem/2448 2448번: 별 찍기 - 11 첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수) www.acmicpc.net 빨간 부분과 주황 부분, 두개의 공간으로 나누어 풀었다. 정답 코드 import sys N = int(sys.stdin.readline()) def draw_stars(N): if N == 3: return [" * "," * * ","*****"] divide = draw_stars(N//2) stars = [] for d in divide: #빨간 공간 stars.append(' '*(N//2)+d+' '*(N//2)) for d in..

Baekjoon Online Judge 2447번 파이썬. 분할 정복.

문제 링크 https://www.acmicpc.net/problem/2447 2447번: 별 찍기 - 10 재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 www.acmicpc.net 빨간 부분을 상, 주황 부분을 중, 노란 부분을 하로 생각해서 3구간으로 나누어 풀었다. 정답 코드 import sys N = int(sys.stdin.readline()) def dnc(N): if N == 1: return ["*"] divide = dnc(N//3) stars = [] for d in divide: #상 stars.append(d*3) f..

Baekjoon Online Judge 11047번 파이썬. 그리디

문제 링크 https://www.acmicpc.net/problem/11047 11047번: 동전 0 첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수) www.acmicpc.net 정답 코드 import sys N, K = map(int,sys.stdin.readline().split()) money = [] for i in range(N): money.append(int(sys.stdin.readline())) count = 0 bill = money[len(money)-1] def greedy(K..

Baekjoon Online Judge 1629번 파이썬. 분할 정복.

문제 링크 https://www.acmicpc.net/problem/1629 1629번: 곱셈 첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다. www.acmicpc.net A^(m+n) = A^m * A^n (A*B)%C = (A%C)*(B%C)%C 위의 지수법칙. 분배 법칙을 알아두어야 한다. 정답 코드 A,B,C = map(int,input().split()) def solution(a,b,c): if b == 1: #a의 1제곱이면. return a%c N = solution(a,b//2,c) # a^(b//2) 구하기 if b % 2 == 0: #b가 짝수 return N*N%c #지수 법칙 사용 else: #b..

Baekjoon Online Judge 1780번 파이썬. 분할 정복.

문제 링크 https://www.acmicpc.net/problem/1780 1780번: 종이의 개수 N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다. 만약 종이가 모두 같은 수 www.acmicpc.net 2630번 문제와 유사하다. 다른 점은 9개로 자르는 것이기 때문에 ‘N//3’을 하고, 재귀함수의 시작점. x,y가 9개 있다는 것이다. 정답 코드 N = int(input()) matrix = [list(map(int,input().split()))for i in range(N)] result = [] def solution(x,y,N): number = matrix[x]..

Baekjoon Online Judge 1992번 파이썬. 분할 정복.

문제 링크 https://www.acmicpc.net/problem/1992 1992번: 쿼드트리 첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 ≤ N ≤ 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또 www.acmicpc.net 2630번과 유사한 문제이다. 하지만 2630번처럼 반복문 안에서 프린팅할 문자열 “(“나 “)”를 추가하면 불필요한 경우에도 괄호가 생기기 때문에 반복문 밖에서 추가해주어야 한다, 출력에 신경써서 풀어야한다. 정답 코드 N = int(input()) tree = [list(map(int,input()))for i in range(N)] def solution(x,y,N):..

Baekjoon Online Judge 2630번 파이썬. 분할정복

문제 링크 https://www.acmicpc.net/problem/2630 2630번: 색종이 만들기 첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다. www.acmicpc.net 분할 정복은 문제를 나눌 수 없을 때까지 나누어서 각각 풀고 합병하는 방식이다. 함수를 재귀적으로 호출하여 문제를 해결한다는 특징이 있다. 전체 종이를 ‘N//2’ 절반씩 나누어 함수에 넣고 더 이상 나누어지지 않을 때까지 함수를 계속해서 불러왔다. 정답 코드 import sys N = int(sys.stdin.readline()) whole = [list(m..

728x90