분류 전체보기 36

[BOJ] 백준 1699번: 제곱수의 합

https://www.acmicpc.net/problem/1699 1699번: 제곱수의 합 어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다 www.acmicpc.net 기본적인 DP 문제입니다. #include using namespace std; int N, dp[100001]; void solve(){ memset(dp, 0x3f, sizeof(dp)); dp[0] = 0; for(int i = 1; i = 1; --j){ dp[i] = min(dp[i], dp[i-j*j] + 1); } } cout > N; solve..

알고리즘/BOJ 2023.02.26

[BOJ] 백준 11727번: 2×n 타일링 2

https://www.acmicpc.net/problem/11727 11727번: 2×n 타일링 2 2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다. www.acmicpc.net 기본적인 DP 문제입니다. #include using namespace std; const int MOD = 10007; int n, dp[1001]; void solve(){ dp[1] = 1; dp[2] = 3; for(int i = 3; i n; solve(); } dp 문제는 1) table 정의 2) 점화식 찾기 3) 초기값 설정의 3단계로 일관성있게 풀이합니다. 1) table 정의 dp[i] : 2×i 크기의 직사..

알고리즘/BOJ 2023.02.26

[BOJ] 백준 11726번: 2×n 타일링

https://www.acmicpc.net/problem/11726 11726번: 2×n 타일링 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다. www.acmicpc.net 이번에도 기본 DP 문제입니다. #include using namespace std; const int MOD = 10007; int n, dp[1001]; void solve(){ dp[1] = 1; dp[2] = 2; for(int i = 3; i n; solve(); } dp 문제는 1) table 정의 2) 점화식 찾기 3) 초기값 설정의 3단계로 일관성 있게 풀이합니다. 1) table 정의 dp[i] : 2..

알고리즘/BOJ 2023.02.26

[BOJ] 백준 1904번: 01타일

https://www.acmicpc.net/problem/1904 1904번: 01타일 지원이에게 2진 수열을 가르쳐 주기 위해, 지원이 아버지는 그에게 타일들을 선물해주셨다. 그리고 이 각각의 타일들은 0 또는 1이 쓰여 있는 낱장의 타일들이다. 어느 날 짓궂은 동주가 지원이 www.acmicpc.net 이번에도 기본 DP 문제입니다. #include using namespace std; const int MOD = 15746; int N, dp[1000001]; void solve(){ dp[1] = 1; dp[2] = 2; for(int i = 3; i N; solve(); } dp 문제는 항상 1) table 정의 2) 점화식 찾기 3) 초기값 설정의 3단계로 일관성있게 풀이합니다. 1) tabl..

알고리즘/BOJ 2023.02.26

[BOJ] 백준 2193번: 이친수

https://www.acmicpc.net/problem/2193 2193번: 이친수 0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다. 이친수는 0으로 시작하지 않 www.acmicpc.net 이번에도 DP 기본 문제입니다. #include #define ll long long using namespace std; int N; ll dp[91][2]; void solve(){ dp[1][0] = 0; dp[1][1] = 1; for(int i = 2; i N; solve(); } 항상 같은 패턴입니다. dp 문제는 1) table 정의 2) 점화식 찾기 3) 초기값 설정의 3..

알고리즘/BOJ 2023.02.26

[BOJ] 백준 2294번: 동전 2

https://www.acmicpc.net/problem/2294 2294번: 동전 2 첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주 www.acmicpc.net 기본적인 DP 문제입니다. #include using namespace std; const int INF = 0x3f3f3f3f; int n, k, coin, dp[10001]; set coins; void solve(){ memset(dp, 0x3f, sizeof(dp)); dp[0] = 0; for(int i = 1; i dp[i-c]+1) dp[i] = dp[i..

알고리즘/BOJ 2023.02.26

[BOJ] 백준 9465번: 스티커

https://www.acmicpc.net/problem/9465 9465번: 스티커 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의 www.acmicpc.net 이번에도 DP 기본 문제입니다. #include using namespace std; int T, n, score[3][100001], dp[100001][3]; void solve(){ dp[1][0] = 0; dp[1][1] = score[1][1]; dp[1][2] = score[2][1]; for(int i = 2; i > n; for(int i = 1; i score[i][j]..

알고리즘/BOJ 2023.02.26

[BOJ] 백준 1463번: 1로 만들기

https://www.acmicpc.net/problem/1463 1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net 기본적인 DP 예제입니다. 1) bottom-up 풀이 #include using namespace std; int N, dp[1000001]; void solve(){ dp[1] = 0; for(int i = 2; i dp[i/3] + 1) dp[i] = dp[i/3] + 1; if(i % 2 == 0 && dp[i] > dp[i/2] + 1) dp[i] = dp[i/2] + 1; } } int main(){ ios::sync_with_stdio(0); cin.tie(0); cin >> N; solve(); ..

알고리즘/BOJ 2023.02.26

[BOJ] 백준 2357번: 최솟값과 최댓값

https://www.acmicpc.net/problem/2357 2357번: 최솟값과 최댓값 N(1 ≤ N ≤ 100,000)개의 정수들이 있을 때, a번째 정수부터 b번째 정수까지 중에서 제일 작은 정수, 또는 제일 큰 정수를 찾는 것은 어려운 일이 아니다. 하지만 이와 같은 a, b의 쌍이 M(1 ≤ M ≤ 100 www.acmicpc.net https://belepi.tistory.com/8 에서 다룬 백준 10868번: 최솟값을 풀어봤을 경우 쉽게 접근할 수 있는 문제입니다. 모든 세그먼트 트리 문제는 indexed tree로 풀 수 있지만 그 역은 성립하지 않습니다. 따라서 indexed tree로 풀이합니다. #include #define SIZETR (262144) // 2^18 using..

알고리즘/BOJ 2023.02.24

[BOJ] 백준 10868번: 최솟값

https://www.acmicpc.net/problem/10868 10868번: 최솟값 N(1 ≤ N ≤ 100,000)개의 정수들이 있을 때, a번째 정수부터 b번째 정수까지 중에서 제일 작은 정수를 찾는 것은 어려운 일이 아니다. 하지만 이와 같은 a, b의 쌍이 M(1 ≤ M ≤ 100,000)개 주어졌을 때는 www.acmicpc.net 주어진 문제의 크기를 보고 알맞은 시간 복잡도의 자료구조와 알고리즘을 선택하고 설계하는 것이 중요합니다. 기껏 프로그램을 구현했는데, 시간초과로 인해 처음부터 다시 풀어야 하는 상황은 피해야 합니다. naive한 풀이로는 아래 코드처럼 매 query마다 a번째 정수부터 b번째 정수를 탐색하면서 최솟값을 찾아 출력하는 O(MN)의 풀이를 생각해볼 수 있습니다. 다..

알고리즘/BOJ 2023.02.24