백준 24460번: 특별상이라도 받고 싶어 (C++)
2023. 1. 26. 22:42ㆍ알고리즘/분할 정복, 재귀

https://www.acmicpc.net/problem/24460
24460번: 특별상이라도 받고 싶어
첫 번째 줄에는 정수 $N$이 주어진다. (단, $N = 2^m$, $0 \le m \le 10$, $m$은 정수) 두 번째 줄부터 $N$개 줄의 $i$번째 줄에는 $i$번째 줄에 있는 의자에 적힌 추첨번호가 주어진다. 각 줄에는 $N$개의 추첨
www.acmicpc.net
풀이
분할 정복 문제. 개념이 이해가 안되서 유형 부수기 중.
사실상 재귀 문제인데 어떻게 설계하는 지가 중요한 듯 하다.
4가지 의자 중에 2번째로 숫자가 작은 의자를 골라야해서 ans[4] 배열에 4가지 분할 된 함수의 값을 넣고
ans[1]을 리턴하면 재귀적으로 ans[4] 배열에는 2번째로 작은 의자만 담기게 된다.
사실 나도 잘 모르겠다. 재귀는 그냥 느껴야 하는 것 같다.
https://www.acmicpc.net/problem/17829
17829번: 222-풀링
조기 졸업을 꿈꾸는 종욱이는 요즘 핫한 딥러닝을 공부하던 중, 이미지 처리에 흔히 쓰이는 합성곱 신경망(Convolutional Neural Network, CNN)의 풀링 연산에 영감을 받아 자신만의 풀링을 만들고 이를 22
www.acmicpc.net
근데 이 문제랑 똑같은 문제인데 왜 난이도가 다르냐
전체 코드
#include <iostream>
#include <cmath>
#include <set>
#include <algorithm>
using namespace std;
int N;
int chair[1100][1100] = { 0, };
int partition(int x, int y, int n) {
int ans[4] = { 0, };
if (n >= 2) {
ans[0] = partition(x, y, n / 2);
ans[1] = partition(x, y + n / 2, n / 2);
ans[2] = partition(x + n / 2, y, n / 2);
ans[3] = partition(x + n / 2, y + n / 2, n / 2);
sort(ans, ans + 4);
return ans[1];
}
else return chair[x][y];
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> N;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) cin >> chair[i][j];
}
cout << partition(0, 0, N);
}
'알고리즘 > 분할 정복, 재귀' 카테고리의 다른 글
백준 1992번: 쿼드트리 (C++) (0) | 2023.02.17 |
---|---|
백준 2630번: 색종이 만들기 (C++) (0) | 2023.01.26 |
백준 1780번: 종이의 개수 (C++) (0) | 2023.01.26 |
백준 11582번: 치킨 TOP N (C++) (0) | 2023.01.26 |