문제

https://www.acmicpc.net/problem/2839

 

2839번: 설탕 배달

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그

www.acmicpc.net

 

풀이

그리디로 풀었다. 5kg으로 먼저 나누어 준후, 3kg으로 나누어지는지 판단하다.

 

나머지가 남는다면 5kg 봉지를 하나씩 빼가면서 다시 탐색한다.

 

코드

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int N;
int main() {
	cin >> N;
	int a = N / 5;
	int b = 0;
	int cnt = 0;
	while (1) {
		

		if (a < 0) {
			cnt = -1;
			break;
		}
		else {
			if ((N - (5 * a)) % 3 == 0) {
				b = (N - (5 * a)) / 3;
				break;
			}
			a--;
		}
	}
	cout << a + b;


	



	return 0;
}

 

 

문제

https://www.acmicpc.net/problem/2805

 

2805번: 나무 자르기

첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보

www.acmicpc.net

풀이

문제를 보면 나무의 높이, 절단기 높이 등 int의 숫자 범위를 넘는다.  또한 적어도+최댓값 등을 찾을 때는 이분 탐색을 의심해보자

 

두 가지 실수하지 않도록 조심하자

1. long long 변수형이 어디 어디에 필요한지

2. 나무절단시 if문을 통해 음수 걸러주기 

 

 

코드

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
int H;
int N;
long long M; //숫자가 너무 큰 탐색 -> 이분탐색 의심
vector<long long> arr;
long long answer;
int main() {
	cin >> N >> M;

	for (int i = 0; i < N; i++) {
		long long abc;
		cin >> abc;
		arr.push_back(abc);
	}

	sort(arr.begin(), arr.end(),greater<>());

	//이분탐색
	long long low = 0;
	long long high = arr[0];
	while (low <= high) {
		long long middle = (low + high) / 2;
		
		long long sum = 0;
		for (int i = 0; i < N; i++) {
			if(arr[i]-middle>0) sum += arr[i] - middle;

		}
		if (sum >=M) {
			low = middle + 1;
			answer = middle;
		}
		else { // 나무 부족, 절단기 높이 줄임
			high = middle - 1;

		}



	}
	cout << answer;





	return 0;
}

문제

https://www.acmicpc.net/problem/2798

 

2798번: 블랙잭

첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장

www.acmicpc.net

풀이

기본적인 Bruth-force 문제였다. 전부 탐색해보면서 대신 모두 같은 카드를 고르는 case는 빼고 탐색하자. 

또한 Sort 를 사용하여 빠르게 최대 값을 찾을 수 있다.

 

 

코드

#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
int N, M;
vector<int> arr;
vector<int> result;
int main() {
	cin >> N >> M;


	for (int i = 0; i < N; i++) {
		int a;
		cin >> a;
		arr.push_back(a);

	}

	//완전탐색
	int sum = 0;
	for (int y = 0; y < N - 2; y++) {
		for (int x = 1; x < N - 1; x++) {
			for (int z = 2; z < N; z++) {
				if (y == x || y == z || x == z) continue;
				sum = arr[y] + arr[x] + arr[z];
				if(sum<=M) result.push_back(sum);
			}
		}
	}



	sort(result.begin(), result.end());
	cout << result[result.size() - 1];


	return 0;
}

문제 

https://www.acmicpc.net/problem/1436

 

1436번: 영화감독 숌

666은 종말을 나타내는 숫자라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타

www.acmicpc.net

풀이

숫자를 문자열로 변환하는 to_string  +  BruthForce 문제였다. 문자열과 숫자를 같이 생각해주면서 1씩 증가해보면서 모든 case를 판단해주면 된다.  문자열 변환을 해주지 않는다면 시간 초과가 날것이다.

 

 

코드 

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int N;
int main() {
	cin >> N;
	int result = 0;
	int K = 666;
	while (1) {
		string target=to_string(K);

		for (int i = 0; i < target.size(); i++) {
			if (target[i] == '6' && target[i + 1] == '6' && target[i + 2] == '6') {
				result++;
				break;

			}
			
		}
		if (result == N) break;
		K++;
	}

	cout << K;



	return 0;
}

'알고리즘 공부 > 백준' 카테고리의 다른 글

[백준] 나무 자르기 (2805/C++)  (0) 2022.01.16
[백준] 블랙잭 (2798 / C++)  (0) 2022.01.16
[백준] 랜선자르기 (1654 / C++)  (0) 2022.01.11
[백준] 스택 수열(1874/C++)  (0) 2022.01.09
[백준] 단어정렬 (C++/1181)  (0) 2021.12.19

+ Recent posts