728x90

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

 

1759번: 암호 만들기

첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.

www.acmicpc.net

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

int r, n;
vector<char> v;

void select(vector<bool> visited, vector<char> result, int num) {
	if (num == r) {
		int vowelCount = 0;
		int consonantCount = 0;	
		for (int i = 0; i < r; i++) {
			if (result[i] == 'a' || result[i] == 'e' || result[i] == 'i' || result[i] == 'o' || result[i] == 'u') 
				vowelCount++;
			else 
				consonantCount++;
		}
		if (!(vowelCount >= 1 && consonantCount >= 2)) {
			return;
		}
		for (int i = 0; i < r; i++) {
			cout << result[i];
		}
		cout << '\n';
		return;
	}
	for (int i = 0; i < n; i++) {
		if (!visited[i]) {
			if (num == 0) {
				visited[i] = true;
				result[num] = v[i];
				select(visited, result, num + 1);
				visited[i] = false;
			}
			else {
				if (result[num - 1] < v[i]) {
					visited[i] = true;
					result[num] = v[i];
					select(visited, result, num + 1);
					visited[i] = false;
				}
			}
		}
	}
}

int main() {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	cin >> r >> n;
	for (int i = 0; i < n; i++) {
		char temp;
		cin >> temp;
		v.push_back(temp);
	}
	sort(v.begin(), v.end());
	vector<char> result(r);
	vector<bool> visited(n);
	select(visited, result, 0);
	return 0;
}
728x90
728x90

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

 

4641번: Doubles

문제 2~15개의 서로 다른 자연수로 이루어진 리스트가 있을 때, 이들 중 리스트 안에 자신의 정확히 2배인 수가 있는 수의 개수를 구하여라. 예를 들어, 리스트가 "1 4 3 2 9 7 18 22"라면 2가 1의 2배, 4가 2의 2배, 18이 9의 2배이므로 답은 3이다. 입력 입력은 여러 개의 테스트 케이스로 주어져 있으며, 입력의 끝에는 -1이 하나 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 2~15개의 서로 다른 자연수가 주어진다.

www.acmicpc.net

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

int main() {
	while (true) {
		int first;
		cin >> first;
		if (first == -1) break;
		vector<int> v;
		v.push_back(first);
		while (true) {
			int n;
			cin >> n;
			if (n == 0) break;
			v.push_back(n);

		}
		int count = 0;
		for (int i = 0; i < v.size(); i++) {
			for (int j = 0; j < v.size(); j++) {
				if (v[j] == v[i] * 2) count++;
			}
		}
		cout << count << '\n';
	}
	return 0;
}
728x90
728x90

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

 

6321번: IBM 빼기 1

문제 '2001: 스페이스 오디세이'는 아서 C. 클라크의 소설이자 스탠리 큐브릭 감독의 영화이다. 이 작품에서 우주선은 토성으로 가고 있다. 긴 여행동안 선원들은 모두 정체 상태에 빠져있고, 두 선원은 깨어나 있다. 우주선은 인공지능 컴퓨터 HAL이 조정하고 있다. HAL은 점점 이상하게 행동하더니 선원들을 죽이기 시작했다. 자세한 이야기는 소설을 읽거나 영화를 보면 알 수 있다. 영화가 유명해지고 난 이후에 사람들은 '2001: 스페이스 오디세이'에

www.acmicpc.net

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


int main() {
	int n;
	cin >> n;
	for (int t = 0; t < n; t++) {
		string s;
		cin >> s;
		cout << "String #" << t + 1 << '\n';
		for (int i = 0; i < s.size(); i++) {
			if (s[i] != 90) cout << (char)(s[i] + 1);
			else cout << 'A';
		}
		cout << "\n\n";
	}
	return 0;
}

'\n'을 두 번 쓸 때에는 "\n\n"이라고 쓰는 거 주의하자. 한 줄만 띄는 게 습관이 되어서 자꾸 '\n\n' 한다. 문제는 그렇게 해도 오류가 안 난다. 'hi'이렇게 알파벳은 컴파일 에러가 나는데 \n은 안 난다.

728x90
728x90

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

 

6378번: 디지털 루트

문제 양의 정수 N의 디지털 루트를 구하려면 N을 이루고 있는 모든 자리수를 더해야 한다. 이때, 더한 값이 한 자리 숫자라면, 그 수가 N의 디지털 루트가 된다. 두 자리 이상 숫자인 경우에는 다시 그 수를 이루고 있는 모든 자리수를 더해야 하며, 한 자리 숫자가 될 때 까지 반복한다. 24의 디지털 루트를 구해보자. 2+4=6이다. 6은 한 자리 숫자이기 때문에, 24의 디지털 루트는 6이 된다. 39의 경우에는 3+9=12이기 때문에, 한 번 더 더

www.acmicpc.net

처음에는 이렇게 제출했었는데 틀렸다.

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


int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	while (true) {
		int n;
		cin >> n;
		if (n == 0) break;
		while (true) {
			vector<int> v;
			while (n != 0) {
				v.push_back(n % 10);
				n /= 10;
			}
			int total = 0;
			for (int i : v) {
				total += i;
			}
			if (total < 10) {
				cout << total << '\n';
				break;
			}
			else {
				n = total;
			}
		}
	}
	return 0;
}

보니까 숫자는 최대 1000자리수라고 했다.

그러니 당연히 아무리 범위가 큰 타입을 써도 오버플로우가 날 수밖에 없었다.

따라서 문자열로 받아서 풀었다.

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


int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int numbers[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	char charNumbers[10] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
	string stringNumbers[10] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
	map<char, int> m;
	map<int, string> sm;
	for (int i = 0; i < 10; i++) {
		m[charNumbers[i]] = numbers[i];
		sm[numbers[i]] = stringNumbers[i];
	}
	while (true) {
		string n;
		cin >> n;
		if (n == "0") break;
		while (true) {
			int total = 0;
			for (int i = 0; i < n.size(); i++) {
				total += m[n[i]];
			}
			if (total < 10) {
				cout << total << '\n';
				break;
			}
			else {
				n = "";
				while (total != 0) {
					n.append(sm[total % 10]);
					total /= 10;
				}
			}
		}
	}
	return 0;
}
728x90

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

[백준] 4641번 Doubles  (0) 2020.02.11
[백준] 6321번 IBM 빼기 1  (0) 2020.02.10
[백준] 6679번 싱기한 네자리 숫자  (0) 2020.02.10
[백준] 2845번 파티가 끝나고 난 뒤  (0) 2020.02.10
[백준] 9012번 괄호  (0) 2020.02.10
728x90

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

 

6679번: 싱기한 네자리 숫자

문제 싱기한 네자리 숫자란, [1000,9999]인 10진수 숫자중에서,  다음의 조건을 만족하는 숫자를 말한다. 숫자를 10진수, 12진수, 16진수로 나타낸 다음, 각각의 숫자에 대해, 각 숫자의 자리수를 더했을 때, 세 값이 모두 같아야 한다. 여러분은 싱기한 네자리 숫자를 모두 출력해야 한다. 입력 입력은 주어지지 않는다. 출력 싱기한 네자리 숫자를 오름차순으로 한줄에 하나씩 출력한다. 예제 입력 1 복사 예제 출력 1 복사 2992 2993 29

www.acmicpc.net

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


int main() {
	ios_base::sync_with_stdio(false);
	for (int i = 1000; i < 10000; i++) {
		vector<int> binary;
		vector<int> hexadecimal;
		vector<int> decimal;
		int n = i;
		while (n != 0) {
			binary.push_back(n % 12);
			n /= 12;
		}
		n = i;
		while (n != 0) {
			int a = n % 16;
			hexadecimal.push_back(a);
			n /= 16;
		}
		n = i;
		while (n != 0) {
			decimal.push_back(n % 10);
			n /= 10;
		}
		int hexadecimalSum = 0;
		int decimalSum = 0;
		int binarySum = 0;
		for (int num : decimal)
			decimalSum += num;
		for (int num : hexadecimal) {
			hexadecimalSum += num;
		}
		for (int num : binary)
			binarySum += num;
		if (binarySum == decimalSum && decimalSum == hexadecimalSum)
			cout << i << '\n';
	}
	return 0;
}

정말 오늘따라 더 느끼는 문제 똑바로 읽기의 중요성.

2진수인줄 알고 2진수, 10진수 16진수로 했는데 답이 안 나와서 이걸가지고 한 시간을 헤맸다. 그런데 12진수였다.

문제를 똑바로 읽자

728x90

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

[백준] 6321번 IBM 빼기 1  (0) 2020.02.10
[백준] 6378번 디지털 루트  (0) 2020.02.10
[백준] 2845번 파티가 끝나고 난 뒤  (0) 2020.02.10
[백준] 9012번 괄호  (0) 2020.02.10
[백준] 2252번 줄 세우기  (0) 2020.02.10
728x90

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

 

2845번: 파티가 끝나고 난 뒤

문제 파티가 끝나고 나면, 사람들은 누가 파티에 왔는지와 얼마나 많은 사람들이 왔는지를 궁금해한다. 보통 파티는 매우 크게 열리기 때문에, 정확하게 몇 명이 참가했는지 알 수가 없다. 지난주 토요일에 상근이는 자신의 3학년 진학을 기념하면서 매우 성대한 파티를 열었다. 그리고, 상근이는 1m2당 몇 명의 사람이 있었는지 알고있다. 상근이의 파티는 정말 엄청난 규모였기 때문에, 대부분의 신문에도 기사가 실렸다. 상근이는 서로 다른 5개의 신문을 보면서 그

www.acmicpc.net

#include <iostream>
using namespace std;


int main() {
	int l, p;
	cin >> l >> p;
	for (int i = 0; i < 5; i++) {
		int a;
		cin >> a;
		cout << a - p * l << " ";
	}
	return 0;
}

오늘 다시 한 번 느낀 것. 문제를 똑바로 읽자. l이 기사의 개수인 줄 알고 for문을 i =0부터 i < l까지 돌려서 틀렸었다.

728x90

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

[백준] 6378번 디지털 루트  (0) 2020.02.10
[백준] 6679번 싱기한 네자리 숫자  (0) 2020.02.10
[백준] 9012번 괄호  (0) 2020.02.10
[백준] 2252번 줄 세우기  (0) 2020.02.10
[백준] 2161번 카드1  (0) 2020.02.09
728x90

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

 

9012번: 괄호

문제 괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(conc

www.acmicpc.net

괄호가 맞는지 아닌지는 스택을 사용하여 알아볼 수 있다.

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


int main() {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	int testCase;
	cin >> testCase;
	for (int t = 0; t < testCase; t++) {
		string s;
		stack<char> stack;
		cin >> s;
		bool flag = false;
		for (int i = 0; i < s.size(); i++) {
			if (s[i] == '(') {
				stack.push('(');
			}
			else {
				if (!stack.empty()) {
					char c = stack.top();
					stack.pop();
					if (c != '(') { //짝이 안 맞으면 NO
						cout << "NO" << '\n';
						flag = true;
						break;
					}
				}
				else {
					cout << "NO" << '\n'; //아직 끝까지 안 봤는데 벌써 스택이 비어있으면 NO
					flag = true;
					break;
				}
			}
		}
		if(!flag && !stack.empty()) cout << "NO" << '\n';
		else if (!flag && stack.empty()) cout << "YES" << '\n';
	}
	return 0;
}
728x90

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

[백준] 6679번 싱기한 네자리 숫자  (0) 2020.02.10
[백준] 2845번 파티가 끝나고 난 뒤  (0) 2020.02.10
[백준] 2252번 줄 세우기  (0) 2020.02.10
[백준] 2161번 카드1  (0) 2020.02.09
[백준] 1120번 문자열  (0) 2020.02.09
728x90

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

 

2252번: 줄 세우기

첫째 줄에 N(1≤N≤32,000), M(1≤M≤100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의미이다. 학생들의 번호는 1번부터 N번이다.

www.acmicpc.net

처음에는 이렇게 제출했는데 시간초과가 났다.

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


int main() {
	int n, m;
	cin >> n >> m;
	vector<int> student[32001];
	for (int i = 0; i < m; i++) {
		int shorter, taller;
		cin >> shorter>> taller;
		student[taller].push_back(shorter);
	}
	vector<int> result;

	while(result.size() < n) {
		for (int i = 1; i <= n; i++) {
			if (student[i].size() == 0 && result.size() < n) {
				result.push_back(i);
				for (int j = 1; j <= n; j++) {
					for (int k = 0; k < student[j].size(); k++) {
						if (student[j][k] == i) student[j].erase(student[j].begin() + k);
					}
				}
			}
		}
	}
	for (int i = 0; i < result.size(); i++) {
		cout << result[i] << " ";
	}
	return 0;
}

딱 봐도 시간초과가 날 것인게, while문 안에 3중 for문을 썼다. 반복문을 4개를 중첩해서 쓰니까 당연히 그럴 수밖에 없다.

그래서 다시 풀었다. 

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


int main() {
	int n, m;
	cin >> n >> m;
	vector<int> student[32001];
	vector<int> inDegree(n + 1);
	for (int i = 0; i < m; i++) {
		int shorter, taller;
		cin >> shorter>> taller;
		student[shorter].push_back(taller);
		inDegree[taller]++;
	}
	queue<int> q;
	for (int i = 1; i <= n; i++) {
		if (inDegree[i] == 0) q.push(i);
	}
	while(!q.empty()) {
		int cur = q.front();
		q.pop();
		cout << cur << " ";
		for (int i = 0; i < student[cur].size(); i++) {
			inDegree[student[cur][i]]--;
			if (inDegree[student[cur][i]] == 0) q.push(student[cur][i]);
		}
	}
	return 0;
}

역시 알고리즘은 정석대로 자료구조 책에 있는 방법대로 해야 하나보다. 그래도 자료구조 수업에서 위상정렬을 배운지 거의 6개월이 넘었는데 방법을 잊지 않고 스스로 구현했다는 것이 대단하다.

728x90

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

[백준] 2845번 파티가 끝나고 난 뒤  (0) 2020.02.10
[백준] 9012번 괄호  (0) 2020.02.10
[백준] 2161번 카드1  (0) 2020.02.09
[백준] 1120번 문자열  (0) 2020.02.09
[백준] 1547번 공  (0) 2020.02.09
728x90

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

 

2161번: 카드1

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가 한 장 남을 때까지 반복하게 된다. 우선, 제일 위에 있는 카드를 바닥에 버린다. 그 다음, 제일 위에 있는 카드를 제일 아래에 있는 카드 밑으로 옮긴다. 예를 들어 N=4인 경우를 생각해 보자. 카드는 제일 위에서부터 1234 의 순서로 놓여있다. 1을 버리

www.acmicpc.net

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


int main() {
	queue<int> q;
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		q.push(i);
	}
	while (true) {
		if (q.size() == 1) break;
		int discard = q.front();
		q.pop();
		cout << discard << " ";
		if (q.size() == 1) break;
		int cur = q.front();
		q.pop();
		q.push(cur);
	}
	cout << q.front();
	return 0;
}
728x90
728x90
 

1120번: 문자열

길이가 N으로 같은 문자열 X와 Y가 있을 때, 두 문자열 X와 Y의 차이는 X[i] ≠ Y[i]인 i의 개수이다. 예를 들어, X=”jimin”, Y=”minji”이면, 둘의 차이는 4이다. 두 문자열 A와 B가 주어진다. 이때, A의 길이는 B의 길이보다 작거나 같다. 이제 A의 길이가 B의 길이와 같아질 때 까지 다음과 같은 연산을 할 수 있다. A의 앞에 아무 알파벳이나 추가한다. A의 뒤에 아무 알파벳이나 추가한다. 이때, A와 B의 길이가 같으

www.acmicpc.net

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


int main() {
	string a, b;
	cin >> a >> b;
	int minCount = 0;
	if (a.size() == b.size()) {
		for (int i = 0; i < a.size(); i++) {
			if (a[i] != b[i]) minCount++;
		}
	}

	else {
		int difference = b.size() - a.size();
		minCount = 51;
		for (int i = 0; i <= difference; i++) {
			int count = 0;
			for (int j = i; j < i + a.size(); j++) {
				if (a[j - i] != b[j]) count++;
			}
			if (count < minCount) minCount = count;
		}
	}
	cout << minCount;
	return 0;
}
728x90

+ Recent posts