728x90
 

4153번: 직각삼각형

문제 과거 이집트인들은 각 변들의 길이가 3, 4, 5인 삼각형이 직각 삼각형인것을 알아냈다. 주어진 세변의 길이로 삼각형이 직각인지 아닌지 구분하시오. 입력 입력은 여러개의 테스트케이스로 주어지며 마지막줄에는 0 0 0이 입력된다. 각 테스트케이스는 모두 30,000보다 작은 양의 정수로 주어지며, 각 입력은 변의 길이를 의미한다. 출력 각 입력에 대해 직각 삼각형이 맞다면 "right", 아니라면 "wrong"을 출력한다. 예제 입력 1 복사 6 8

www.acmicpc.net

#include <iostream>
using namespace std;


int main() {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	while (true) {
		int x, y, z;
		cin >> x >> y >> z;
		if (x == 0 && y == 0 && z == 0) break;
		if (x >= y && x >= z) {
			if (y * y + z * z == x * x) cout << "right" << '\n';
			else cout << "wrong" << '\n';
		}
		else if (y >= x && y >= z) {
			if (x * x + z * z == y * y) cout << "right" << '\n';
			else cout << "wrong" << '\n';
		}
		else if (z >= x && z >= y) {
			if(x * x + y * y == z * z) cout << "right" << '\n';
			else cout << "wrong" << '\n';
		}
	}
	return 0;
}
728x90

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

[백준] 2468번 안전영역  (0) 2020.02.06
[백준] 10026번 적록색약  (0) 2020.02.06
[백준] 3009번 네 번째 점  (0) 2020.02.05
[백준] 10845번 큐  (0) 2020.02.05
[백준] 1260번 DFS와 BFS  (0) 2020.02.04
728x90
 

3009번: 네 번째 점

문제 세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오. 입력 세 점의 좌표가 한 줄에 하나씩 주어진다. 좌표는 1보다 크거나 같고, 1000보다 작거나 같은 정수이다. 출력 직사각형의 네 번째 점의 좌표를 출력한다. 예제 입력 1 복사 30 20 10 10 10 20 예제 출력 1 복사 30 10...

www.acmicpc.net

#include <iostream>
using namespace std;


int main() {
	int x1, y1, x2, y2, x3, y3, x4, y4;
	cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
	if (x1 == x2) x4 = x3;
	else if (x1 == x3) x4 = x2;
	else if (x2 == x3) x4 = x1;
	if (y1 == y2) y4 = y3;
	else if (y1 == y3) y4 = y2;
	else if (y2 == y3) y4 = y1;
	cout << x4 << " " << y4;
	return 0;
}
728x90

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

[백준] 10026번 적록색약  (0) 2020.02.06
[백준] 4153번 직각삼각형  (0) 2020.02.05
[백준] 10845번 큐  (0) 2020.02.05
[백준] 1260번 DFS와 BFS  (0) 2020.02.04
[백준] 1753번 최단경로  (0) 2020.02.04
728x90
 

10845번: 큐

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

www.acmicpc.net

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


int main() {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	int n; 
	cin >> n;
	queue<int> q;
	for (int i = 0; i < n; i++) {
		string s;
		cin >> s;
		if (s == "push") {
			int num;
			cin >> num;
			q.push(num);
		}
		else if (s == "pop") {
			if (!q.empty()) {
				cout << q.front() << '\n';
				q.pop();
			}
			else cout << -1 << '\n';
		}
		else if (s =="empty") {
			cout << q.empty() << '\n';
		}
		else if (s == "size") {
			cout << q.size() << '\n';
		}
		else if (s == "front") {
			if (!q.empty())
				cout << q.front() << '\n';
			else cout << -1 << '\n';
		}
		else if (s == "back") {
			if (!q.empty())
				cout << q.back() << '\n';
			else cout << -1 << '\n';
		}
	}
	return 0;
}
728x90

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

[백준] 4153번 직각삼각형  (0) 2020.02.05
[백준] 3009번 네 번째 점  (0) 2020.02.05
[백준] 1260번 DFS와 BFS  (0) 2020.02.04
[백준] 1753번 최단경로  (0) 2020.02.04
[백준] 11279번 최대 힙  (0) 2020.02.03
728x90
 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.

www.acmicpc.net

파이썬과 C++로 풀어보았다.

두 언어 간 속도 차이는 엄청나다.

 

우선 파이썬으로 짠 코드이다. 그래프 클래스를 구현했다.

class Graph:
    def __init__(self, n):
        self.data = {}
        for i in range(1, n + 1):
            self.data[i] = set()
    def add_edge(self, n, m):
        self.data[n].add(m)
        self.data[m].add(n)
    def dfs(self, start):
        visited = [False] * (len(self.data) + 1)
        stack = []
        stack.append(start)
        while stack:
            cur = stack.pop()
            if not visited[cur]:
                print(cur, end=" ")
            visited[cur] = True
            temp = []
            for i in self.data[cur]:
                if not visited[i]:
                    temp.append(i)
            temp.sort()
            temp.reverse()
            stack.extend(temp)
    def bfs(self, start):
        import collections
        visited = [False] * (len(self.data) + 1)
        queue = collections.deque()
        queue.append(start)
        while queue:
            cur = queue.popleft()
            if not visited[cur]:
                print(cur, end=' ')
            visited[cur] = True
            temp = []
            for i in self.data[cur]:
                if not visited[i]:
                    temp.append(i)
            temp.sort()
            queue.extend(temp)
from sys import stdin

node_edge_start = list(map(int, stdin.readline().split()))
graph = Graph(node_edge_start[0])
li = []
for i in range(0, node_edge_start[1]):
    rawInput = list(map(int, stdin.readline().split()))
    graph.add_edge(rawInput[0], rawInput[1])
graph.dfs(node_edge_start[2])
print()
graph.bfs(node_edge_start[2])

 

C++로 짠 코드. 자식이 여러개라면 작은 수부터 방문한다는 조건이 있어서 <algorithm>의 sort() 함수를 이용해서 정렬해주었다.

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

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

vector<int> w[1001];
int n, m, startNode;

void dfs() {
	vector<bool> visited(n + 1);
	stack<int> stack;
	stack.push(startNode);
	while (!stack.empty()) {
		int cur = stack.top();
		stack.pop();
		if (!visited[cur]) {
			cout << cur << " ";
		}
		visited[cur] = true;
		for (int v : w[cur]) {
			if (!visited[v])
				stack.push(v);
		}
	}
}
void bfs() {
	vector<bool> visited(n + 1);
	queue<int> q;
	q.push(startNode);
	while (!q.empty()) {
		int cur = q.front();
		q.pop();
		if (!visited[cur])
			cout << cur << " ";
		visited[cur] = true;
		for (int v : w[cur]) {
			if (!visited[v]) {
				q.push(v);
			}
		}
	}
}

int main() {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	cin >> n >> m >> startNode;
	int v1, v2;
	for (int i = 0; i < m; i++) {
		cin >> v1 >> v2;
		w[v1].push_back(v2);
		w[v2].push_back(v1);
	}
	for (int i = 1; i <= n; i++) {
		sort(w[i].begin(), w[i].end(), cmp);
	}
	dfs();
	cout << endl;
	for (int i = 1; i <= n; i++) {
		sort(w[i].begin(), w[i].end());
	}
	bfs();
	return 0;
}
728x90

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

[백준] 3009번 네 번째 점  (0) 2020.02.05
[백준] 10845번 큐  (0) 2020.02.05
[백준] 1753번 최단경로  (0) 2020.02.04
[백준] 11279번 최대 힙  (0) 2020.02.03
[백준] 2581번 소수  (0) 2020.02.03
728x90
 

1753번: 최단경로

첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1≤V≤20,000, 1≤E≤300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1≤K≤V)가 주어진다. 셋째 줄부터 E개의 줄에 걸쳐 각 간선을 나타내는 세 개의 정수 (u, v, w)가 순서대로 주어진다. 이는 u에서 v로 가는 가중치 w인 간선이 존재한다는 뜻이다. u와 v는 서로 다르며 w는 10 이하의 자연수이다. 서로 다른 두

www.acmicpc.net

#include <iostream> 
#include <vector> 
#include <queue> 
#include <algorithm>
using namespace std;
vector<pair<int, int>> adj[20002];
int length[20002];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q; //비용 적은 것이 우선이 되게 오름차순 정렬
bool visited[20002];

int main() {
	int numOfVertex, numOfEdge, startNode;
	cin >> numOfVertex >> numOfEdge >> startNode;
	const int INF = 2147483647;
	int from, to, weight;
	for (int i = 0; i < numOfEdge; i++) {
		cin >> from >> to >> weight;
		adj[from].push_back(pair<int, int>(weight, to)); //pair의 앞쪽에 있는 숫자를 기준으로 오름차순 정렬하므로 가중치를 앞에 둔다.
	}
	for (int i = 1; i <= numOfVertex; i++) {
		length[i] = INF;
	}
	length[startNode] = 0; //나에서 나로 가는 최단경로는 0
	q.push(make_pair(0, startNode));
	while (!q.empty()) {
		int cost = q.top().first;
		int now = q.top().second;
		q.pop();
		if (length[now] < cost || visited[now]) continue;
		visited[now] = true;
		for (int i = 0; i < adj[now].size(); i++) {
			if (length[adj[now][i].second] > adj[now][i].first + cost) {
				q.push(make_pair(adj[now][i].first + cost, adj[now][i].second));
				length[adj[now][i].second] = adj[now][i].first + cost;
			}
		}
	}
	for (int i = 1; i <= numOfVertex; i++) {
		if (length[i] >= INF) cout <<"INF\n";
		else cout << length[i] << '\n';
	}
	return 0;
}
728x90

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

[백준] 10845번 큐  (0) 2020.02.05
[백준] 1260번 DFS와 BFS  (0) 2020.02.04
[백준] 11279번 최대 힙  (0) 2020.02.03
[백준] 2581번 소수  (0) 2020.02.03
[백준] 1427번 소트인사이드  (0) 2020.02.03
728x90
 

11279번: 최대 힙

첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0이라면 배열에서 가장 큰 값을 출력하고 그 값을 배열에서 제거하는 경우이다. 입력되는 자연수는 2^31보다 작다.

www.acmicpc.net

 

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

int main() {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	priority_queue<int, vector<int>, less<int>> q;
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		int x;
		cin >> x;
		if (x == 0) {
			if (q.empty()) cout << 0 << '\n';
			else {
				cout << q.top() << '\n';
				q.pop();
			}
		}
		else {
			q.push(x);
		}
	}
	return 0;
}
728x90

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

[백준] 1260번 DFS와 BFS  (0) 2020.02.04
[백준] 1753번 최단경로  (0) 2020.02.04
[백준] 2581번 소수  (0) 2020.02.03
[백준] 1427번 소트인사이드  (0) 2020.02.03
[백준] 1920번 수 찾기  (0) 2020.02.03
728x90
 

2581번: 소수

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.  단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.

www.acmicpc.net

1은 소수가 아니라는 거 아주 잘 알면서도 코드 짤 때에는 그걸 생각을 안 하고 코드를 짠다.

소수 문제 풀 때 꼭 기억하자 1은 소수가 아니다!

1은 따로 예외로 두고 코드를 짜자.

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

int main() {
	int m, n;
	cin >> m >> n;
	vector<int> v;
	for (int i = m; i <= n; i++) {
		bool flag = false;
		for (int j = 2; j < i / 2 + 1; j++) {
			if (i % j == 0) {
				flag = true;
				break;
			}
		}
		if (i == 1) flag = true;
		if (!flag) v.push_back(i);
	}
	if (v.size() == 0) cout << -1 << endl;
	else {
		int total = 0;
		for (int i = 0; i < v.size(); i++) {
			total += v[i];
		}
		cout << total << endl;
		cout << v[0] << endl;
	}
	return 0;
}
728x90

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

[백준] 1753번 최단경로  (0) 2020.02.04
[백준] 11279번 최대 힙  (0) 2020.02.03
[백준] 1427번 소트인사이드  (0) 2020.02.03
[백준] 1920번 수 찾기  (0) 2020.02.03
[백준] 2869번 달팽이는 올라가고 싶다  (0) 2020.02.03
728x90
 

1427번: 소트인사이드

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

www.acmicpc.net

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

int main() {
	int n;
	cin >> n;
	vector<int> arr;
	while (true) {
		if (n == 0) break;
		arr.push_back(n % 10);
		n /= 10;
	}
	sort(arr.begin(), arr.end());
	for (int i = arr.size() - 1; i >= 0; i--) {
		cout << arr[i];
	}
	return 0;
}
728x90

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

[백준] 11279번 최대 힙  (0) 2020.02.03
[백준] 2581번 소수  (0) 2020.02.03
[백준] 1920번 수 찾기  (0) 2020.02.03
[백준] 2869번 달팽이는 올라가고 싶다  (0) 2020.02.03
[백준] 1712 손익분기점  (0) 2020.02.02
728x90
 

1920번: 수 찾기

첫째 줄에 자연수 N(1≤N≤100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1≤M≤100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안에 존재하는지 알아내면 된다. 모든 정수들의 범위는 int 로 한다.

www.acmicpc.net

비주얼 스튜디오에서 돌릴 때에는 문제 없었지만 제출할 때에는 algorithm 헤더파일을 include 하지 않으니 컴파일 에러가 났다. 오늘도 잊지말자. find() 함수를 쓰려면 <algorithm> 헤더파일을 포함하자.

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

int main() {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	int n, m;
	cin >> n;
	vector<int> arr(n);
	for (int i = 0; i < n; i++) {
		cin >> arr[i];
	}
	cin >> m;
	for (int i = 0; i < m; i++) {
		int temp;
		cin >> temp;
		vector<int>::iterator iter;
		iter = find(arr.begin(), arr.end(), temp);
		if (iter != arr.end()) {
			cout << 1 << '\n';
		}
		else cout << 0 << '\n';
	}
	return 0;
}

앞에 cin.tie(NULL);과 ios_base::sync_with_stdio(false);는 입출력 속도 향상을 위함이다. 이 글을 참고하면 된다.

 

[C++] 백준 시간초과 문제 해결 입출력 속도 향상

cin과 cout을 사용한다면 cin.tie(NULL); ios_base::sync_with_stdio(false) 이 코드를 추가해주면 속도가 향상된다. 그리고 줄바꿈을 해야 한다면 cout << a << endl; 보다는 cout << a << '\n' 이렇게 해주는 것..

breakcoding.tistory.com

줄바꿈을 할 때에 endl을 쓰지 않고 '\n'을 써준 것도 시간초과가 나지 않도록 하기 위함이다.

728x90
728x90
 

2869번: 달팽이는 올라가고 싶다

문제 땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다. 달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다. 달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오. 입력 첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000) 출력 첫째 줄에 달팽

www.acmicpc.net

#include <iostream>
using namespace std;

int main() {
	int a, b, v;
	cin >> a >> b >> v;
	v -= a;
	int day = 1;
	day += (v / (a - b));
	if (v % (b - a) != 0)
		day++;
	cout << day;
	return 0;
}
728x90

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

[백준] 1427번 소트인사이드  (0) 2020.02.03
[백준] 1920번 수 찾기  (0) 2020.02.03
[백준] 1712 손익분기점  (0) 2020.02.02
[백준] 1085번 직사각형에서 탈출  (0) 2020.02.02
[백준] 10250번 ACM 호텔  (0) 2020.02.01

+ Recent posts