728x90

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

 

4659번: 비밀번호 발음하기

문제 좋은 패스워드를 만드는것은 어려운 일이다. 대부분의 사용자들은 buddy처럼 발음하기 좋고 기억하기 쉬운 패스워드를 원하나, 이런 패스워드들은 보안의 문제가 발생한다. 어떤 사이트들은 xvtpzyo 같은 비밀번호를 무작위로 부여해 주기도 하지만, 사용자들은 이를 외우는데 어려움을 느끼고 심지어는 포스트잇에 적어 컴퓨터에 붙여놓는다. 가장 이상적인 해결법은 '발음이 가능한' 패스워드를 만드는 것으로 적당히 외우기 쉬우면서도 안전하게 계정을 지킬 수 있

www.acmicpc.net

#include <iostream>
#include <string>
#include <vector>
using namespace std;


int main() {
	while (true) {
		string s;
		cin >> s;
		if (s == "end") break;
		bool flag = false;
		int countVowel = 0;
		vector<bool> isVowel(s.size());
		
		if (s[0] == 'a' || s[0] == 'e' || s[0] == 'i' || s[0] == 'o' || s[0] == 'u') {
			countVowel++;
			isVowel[0] = true;
		}
		for (int i = 1; i < s.size(); i++) {
			if (s[i] != 'e' && s[i] != 'o' && s[i - 1] == s[i]) {
				flag = true;
				break;
			}
			if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u') {
				countVowel++;
				isVowel[i] = true;
			}
		}
		if (flag || countVowel == 0) {
			cout << '<' << s << "> is not acceptable.\n";
			continue;
		}
		for (int i = 2; i < s.size(); i++) {
			if (isVowel[i - 2] == isVowel[i - 1] && isVowel[i - 1] == isVowel[i]) {
				flag = true;
				break;
			}
		}
		if(flag) cout << '<' << s << "> is not acceptable.\n";
		else cout << '<' << s << "> is acceptable.\n";
	}
	return 0;
}
728x90
728x90

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

 

4690번: 완전 세제곱

문제 페르마의 마지막 정리는, a, b, c가 0이 아닌 정수이고, n이 2보다 큰 자연수 일 때, an = bn + cn을 만족하는 자연수 a, b, c가 존재하지 않는다는 정리이다. 이 정리는 아직 증명되지 않았다. 하지만, 완전 세제곱 방정식 a3 = b3 + c3 + d3을 만족하는 1보다 큰 자연수를 찾는 것은 어렵지 않다. (123 = 63 + 83 + 103) 이러한 완전 세제곱 방정식과 a ≤ 100을 만족하는 {a, b, c, d}쌍을 모

www.acmicpc.net

#include <iostream>
#include <cmath>
using namespace std;


int main() {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	for (int a = 2; a <= 100; a++) {
		for (int b = 2; b < a; b++) {
			for (int c = b; c < a; c++) {
				for (int d = c; d < a; d++) {
					if (pow(a, 3) == pow(b, 3) + pow(c, 3) + pow(d, 3)) {
						cout << "Cube = " << a << ", Triple = (" << b << "," << c << "," << d << ")\n";

					}
				}
			}
		}
	}
	return 0;
}
728x90
728x90

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

 

1592번: 영식이와 친구들

일단 1번이 공을 잡는다. 1번은 공을 한 번 잡았기 때문에, 공을 3번에게 던진다. 3번은 공을 한 번 잡았기 때문에, 공을 5번에게 던진다. 5번은 2번에게 던지고, 2번은 4번에게 던진다. 4번은 1번에게 던진다. 1번은 이제 공을 두 번 잡았기 때문에, 공을 4번에게 던진다. 4번은 2번에게 던지고, 2번은 5번에게 던지고, 5번은 3번에게 던지고, 마지막으로 3번은 1번에게 던진다. 1번은 이제 공을 세 번 잡았기 때문에, 게임은 끝난다.

www.acmicpc.net

#include <iostream>
#include <tuple>
#include <vector>
#include <map>
#include <queue>
using namespace std;


int main() {
	int numOfPeople, m, l;
	cin >> numOfPeople >> m >> l;
	vector<int> count(numOfPeople);
	int currentPerson = 0;
	count[currentPerson] = 1;
	int ballTossCount = 0;
	while (true) {
		ballTossCount++;
		if (count[0] % 2 == 0) {
			currentPerson = (currentPerson - l + numOfPeople) % numOfPeople;
		}
		else {
			currentPerson = (currentPerson + l) % numOfPeople;
		}
		count[currentPerson]++;
		if (count[currentPerson] == m) break;
	}
	cout << ballTossCount;
	return 0;
}
728x90
728x90

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

 

1526번: 가장 큰 금민수

첫째 줄에 N이 주어진다. N은 4보다 크거나 같고 1,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

#include <iostream>
using namespace std;


int main() {
	int n;
	cin >> n;
	for (int i = n; i >= 4; i--) {
		int numerator = i;
		int flag = false;
		while (numerator != 0) {
			if (numerator % 10 == 4 || numerator % 10 == 7) {
				numerator /= 10;
			}
			else {
				flag = true;
				break;
			}
		}
		if (!flag) {
			cout << i;
			return 0;
		}
	}
	return 0;
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 4690번 완전 세제곱  (0) 2020.02.12
[백준] 1592번 영식이와 친구들  (0) 2020.02.12
[백준] 9237번 이장님 초대  (0) 2020.02.12
[백준] 1991번 트리 순회  (0) 2020.02.12
[백준] 6376번 e 계산  (0) 2020.02.11
728x90

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

 

9237번: 이장님 초대

문제 농부 상근이는 마당에 심기 위한 나무 묘목 n개를 구입했다. 묘목 하나를 심는데 걸리는 시간은 1일이고, 상근이는 각 묘목이 다 자라는데 며칠이 걸리는지 정확하게 알고 있다. 상근이는 마을 이장님을 초대해 자신이 심은 나무를 자랑하려고 한다. 이장님을 실망시키면 안되기 때문에, 모든 나무가 완전히 자란 이후에 이장님을 초대하려고 한다. 즉, 마지막 나무가 다 자란 다음날 이장님을 초대할 것이다. 상근이는 나무를 심는 순서를 신중하게 골라 이장님을 최

www.acmicpc.net

#include <iostream>
#include <vector>
using namespace std;

bool cmp(int a, int b) {
	return a > b;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	int n;
	cin >> n;
	vector<int> v(n);
	for (int i = 0; i < n; i++) {
		cin >> v[i];
	}
	sort(v.begin(), v.end(), cmp);
	int maxDay = 0;
	for (int i = 0; i < v.size(); i++) {
		v[i] = v[i] + i + 2;
		if (v[i] > maxDay) maxDay = v[i];
	}
	cout << maxDay;
	return 0;
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 1592번 영식이와 친구들  (0) 2020.02.12
[백준] 1526번 가장 큰 금민수  (0) 2020.02.12
[백준] 1991번 트리 순회  (0) 2020.02.12
[백준] 6376번 e 계산  (0) 2020.02.11
[백준] 2979번 트럭 주차  (0) 2020.02.11
728x90

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

 

1991번: 트리 순회

첫째 줄에는 이진 트리의 노드의 개수 N(1≤N≤26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 영문자 대문자로 매겨지며, 항상 A가 루트 노드가 된다. 자식 노드가 없는 경우에는 .으로 표현된다.

www.acmicpc.net

#include <iostream>
#include <tuple>
#include <vector>
#include <map>
using namespace std;

map<char, pair<char, char>> m;

void preorder(char root) {
	cout << root;
	if (m[root].first != '.')
		preorder(m[root].first);
	if (m[root].second != '.')
		preorder(m[root].second);
}
void inorder(char root) {
	if (m[root].first != '.')
		inorder(m[root].first);
	cout << root;
	if (m[root].second != '.')
		inorder(m[root].second);
}
void postorder(char root) {
	if(m[root].first != '.')
		postorder(m[root].first);
	if(m[root].second != '.')
		postorder(m[root].second);
	cout << root;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		char root, left, right;
		cin >> root >> left >> right;
		m[root] = make_pair(left, right);
	}
	preorder('A');
	cout << '\n';
	inorder('A');
	cout << '\n';
	postorder('A');
	return 0;
}

자료구조 시간에 배운 것과 이런 문제를 풀 때 사용하는 자료구조에는 조금 거리가 있는 것 같다.

트리 구조체나 클래스를 직접 만들지 않아도 이렇게 풀 수 있다.

https://breakcoding.tistory.com/205

 

[C++] 포인터 없이 map으로 이진트리 구현하기, 전위, 중위, 후위순회

C++로 트리 자료구조를 구현할 때에는 보통 왼쪽 자식을 가리키는 포인터, 오른쪽 자식을 가리키는 포인터, 내 데이터 이렇게 3가지 정보를 가지고 있는 Node라는 구조체를 만들어서 구현한다. 그런데 이 방법은..

breakcoding.tistory.com

처음에는 이진트리 클래스를 직접 만들었었는데 insert하는 과정에서 위상정렬을 해야 트리에 노드를 삽입할 수 있었다.

따라서 그냥 편리하게 map을 만들었다. 다른 사람들은 어떻게 트리를 구현했는지 찾아봐야겠다.

728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 1526번 가장 큰 금민수  (0) 2020.02.12
[백준] 9237번 이장님 초대  (0) 2020.02.12
[백준] 6376번 e 계산  (0) 2020.02.11
[백준] 2979번 트럭 주차  (0) 2020.02.11
[백준] 5532번 방학 숙제  (0) 2020.02.11
728x90

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

 

6376번: e 계산

문제 e는 \[e=\sum_{i=0}^{n} {\frac{1}{i!}}\] 이다. 여기서 n은 무한대이다. 매우 작은 n에 대해서, e의 근사값을 구해보자. 출력 아래 결과와 같은 형식으로 e의 근사값을 n = 0부터 9까지 출력한다.  예제 입력 1 복사 예제 출력 1 복사 n e - ----------- 0 1 1 2 2 2.5 3 2.666666667 4 2.708333333...

www.acmicpc.net

문제 자체는 어렵지 않았는데 출력 형식 조정하느라 애를 먹었다.

처음에는 for문을 0부터 9까지 돌리면서 cout << n << setprecision(10) << sum <<'\n'; 했는데 틀려서

for문을 0부터 9까지 돌리면서 cout << n << " " << fixed << setprecision(9) << sum << '\n'; 했는데 또 틀렸다.

 

결국은 for를 둘로 나눠서 출력했더니 맞았다.

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
	cout << "n e" << '\n';
	cout << "- -----------" << '\n';
	for (int n = 0; n <= 2; n++) { //n
		double sum = 0;
		for (int i = 0; i <= n; i++) {
			int denominator = 1;
			for (int j = i; j > 0; j--) {
				denominator *= j;
			}
			sum += (1 / (double)denominator);
		}
		cout << n << " " << sum << '\n';
	}
	for (int n = 3; n <= 9; n++) { //n
		double sum = 0;
		for (int i = 0; i <= n; i++) {
			int denominator = 1;
			for (int j = i; j > 0; j--) {
				denominator *= j;
			}
			sum += (1 / (double)denominator);
		}
		cout << n << " " << fixed << setprecision(9) << sum << '\n';
	}
	return 0;
}
728x90
728x90

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

 

2979번: 트럭 주차

문제 상근이는 트럭을 총 세 대 가지고 있다. 오늘은 트럭을 주차하는데 비용이 얼마나 필요한지 알아보려고 한다. 상근이가 이용하는 주차장은 주차하는 트럭의 수에 따라서 주차 요금을 할인해 준다. 트럭을 한 대 주차할 때는 1분에 한 대당 A원을 내야 한다. 두 대를 주차할 때는 1분에 한 대당 B원, 세 대를 주차할 때는 1분에 한 대당 C원을 내야 한다. A, B, C가 주어지고, 상근이의 트럭이 주차장에 주차된 시간이 주어졌을 때, 주차 요금으로 얼마

www.acmicpc.net

#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <algorithm>
using namespace std;


int main() {
	int fee[3];
	for (int i = 0; i < 3; i++) {
		cin >> fee[i];
	}
	int arriveTime[3];
	int leaveTime[3];
	vector<pair<int, int>> time;
	for (int i = 0; i < 3; i++) {
		cin >> arriveTime[i];
		cin >> leaveTime[i];
		time.push_back(make_pair(arriveTime[i], 1));
		time.push_back(make_pair(leaveTime[i], -1));
	}
	sort(time.begin(), time.end());
	int count = 1;
	int totalFee = 0;
	int previousTime = time[0].first;
	for (int i = 1; i < 6; i++) {
		int feePerHour = fee[count - 1];
		int now = time[i].first;
		totalFee += ((now - previousTime) * feePerHour * count);
		count += time[i].second;
		previousTime = time[i].first;
 	}
	
	cout << totalFee;
	return 0;
}

어제도 그래놓고는.. 오늘도 다짐한다. 문제를 똑바로 읽자.

트럭 1대면 A원, 2대면 B원, 3대면 C원인 줄 알았는데 한 대당 A원, B원, C원이었다.

728x90
728x90

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

 

5532번: 방학 숙제

문제 상근이는 초등학교에 다닐 때, 방학 숙제를 남들보다 먼저 미리 하고 남은 기간을 놀았다. 방학 숙제는 수학과 국어 문제 풀기이다. 방학은 총 L일이다. 수학은 총 B페이지, 국어는 총 A페이지를 풀어야 한다. 상근이는 하루에 국어를 최대 C페이지, 수학을 최대 D페이지 풀 수 있다. 상근이가 겨울 방학동안 숙제를 하지 않고 놀 수 있는 최대 날의 수를 구하는 프로그램을 작성하시오. 입력 한 줄에 하나씩 총 다섯 줄에 걸쳐 L, A, B, C, D가

www.acmicpc.net

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;


int main() {
	int vacationDays, koreanTotal, mathTotal, koreanMaxPage, mathMaxPage;
	cin >> vacationDays >> koreanTotal >> mathTotal >> koreanMaxPage >> mathMaxPage;
	int days = 1;
	while (true) {
		koreanTotal -= koreanMaxPage;
		mathTotal -= mathMaxPage;
		if (koreanTotal <= 0 && mathTotal <= 0) break;
		days++;
	}
	cout << vacationDays - days;
	return 0;
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 6376번 e 계산  (0) 2020.02.11
[백준] 2979번 트럭 주차  (0) 2020.02.11
[백준] 2661번 좋은 수열 (시간초과로 미해결)  (0) 2020.02.11
[백준] 1759번 암호 만들기  (0) 2020.02.11
[백준] 4641번 Doubles  (0) 2020.02.11
728x90

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

 

2661번: 좋은수열

첫 번째 줄에 1, 2, 3으로만 이루어져 있는 길이가 N인 좋은 수열들 중에서 가장 작은 수를 나타내는 수열만 출력한다. 수열을 이루는 1, 2, 3들 사이에는 빈칸을 두지 않는다.

www.acmicpc.net

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int n;
bool foundAnswer = false;

void select(vector<int> result, int num) {
	if (foundAnswer) return;
	if (num == n) {
		string s = "";
		for (int i = 0; i < n; i++) {
			s += to_string(result[i]);
		}
		for (int i = 0; i < n; i++) { //어디서부터 시작하는지
			for (int j = 1; j < n - i; j++) { //몇개짜리 수열인지
				if (s.substr(i, j) == s.substr(i + j, j)) {
					return;
				}
			}
		}

		foundAnswer = true;
		for (int i = 0; i < n; i++) {
			cout << result[i];
		}
		return;
	}
	for (int i = 1; i <= 3; i++) {
		result[num] = i;
		select(result, num + 1);
	}
}

int main() {
	cin >> n;
	vector<int> result(n);
	select(result, 0);
	return 0;
}

시간초과

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int n;
bool foundAnswer = false;

void select(string result, int num) {
	if (foundAnswer) return;
	if (num == n) {
		for (int i = 0; i < n; i++) { //어디서부터 시작하는지
			for (int j = 1; j < n - i; j++) { //몇개짜리 수열인지
				if (result.substr(i, j) == result.substr(i + j, j)) {
					return;
				}
			}
		}

		foundAnswer = true;
		cout << result;
		return;
	}
	for (int i = 0; i < 3; i++) {
		result[num] = '1' + i;
		select(result, num + 1);
	}
}

int main() {
	cin >> n;
	string result("");
	for (int i = 0; i < n; i++)
		result.append("1");
	select(result, 0);
	return 0;
}

애초에 string으로 해보았다. 이것도 시간초과

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int n;
bool foundAnswer = false;

void select(string result, int num) {
	if (foundAnswer) return;
	if (num == n) {
		for (int i = 0; i < n; i++) { //어디서부터 시작하는지
			for (int j = 2; j < n - i; j++) { //몇개짜리 수열인지
				if (result.substr(i, j) == result.substr(i + j, j)) {
					return;
				}
			}
		}

		foundAnswer = true;
		cout << result;
		return;
	}
	for (int i = 0; i < 3; i++) {
		if (num == 0) {
			result[num] = '1' + i;
			select(result, num + 1);
		}
		else {
			if (result[num - 1] == '1' + i) continue;
			result[num] = '1' + i;
			select(result, num + 1);
		}
	}
}

int main() {
	cin >> n;
	string result("");
	for (int i = 0; i < n; i++)
		result.append("1");
	select(result, 0);
	return 0;
}

재귀호출 전에 인접한 것이 같으면 재귀호출을 안 하도록 했는데 이것도 시간초과

728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 2979번 트럭 주차  (0) 2020.02.11
[백준] 5532번 방학 숙제  (0) 2020.02.11
[백준] 1759번 암호 만들기  (0) 2020.02.11
[백준] 4641번 Doubles  (0) 2020.02.11
[백준] 6321번 IBM 빼기 1  (0) 2020.02.10

+ Recent posts