목록Study/Algorithm (400)
hwooo
https://www.acmicpc.net/problem/1269 1269번: 대칭 차집합 첫째 줄에 집합 A의 원소의 개수와 집합 B의 원소의 개수가 빈 칸을 사이에 두고 주어진다. 둘째 줄에는 집합 A의 모든 원소가, 셋째 줄에는 집합 B의 모든 원소가 빈 칸을 사이에 두고 각각 주어 www.acmicpc.net 풀이 A, B 집합을 따로 받고 A에서 B의 원소가 없다면, B에서 A의 원소가 없다면 cnt++ 코드 #include #include #include #include using namespace std; int main() { int a, b, cnt = 0; set A, B; string s; scanf("%d %d", &a, &b); for (int i = 0; i < a; i++) {..
https://www.acmicpc.net/problem/1764 1764번: 듣보잡 첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. www.acmicpc.net 풀이 듣도 못한 사람을 모두 set에 넣고, 보도 못한 사람을 입력 받는 동시에 듣도 못한 사람에 속하는 지 비교 후 저장. 코드 #include #include #include #include using namespace std; set A, B; int main() { int N, M; string S; scanf("%d %d", &N, &M); for (int i = 0; i < N; i+..
https://www.acmicpc.net/problem/2805 2805번: 나무 자르기 첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보 www.acmicpc.net 풀이 처음엔 내림차순으로 정렬 후 i+1번째 원소와 크기를 비교해가며 구했는데, 나무의 높이가 다 같은 값이면 시간 초과가 발생했다. 이 외에도 여러 반례들이 있어 수정하여 맞추긴 했지만 비효율적이라 알고리즘 분류를 보고 이분 탐색으로 다시 풀어봤다. (두 코드 모두 시행 시간은 같음. 그 와중에 효율은 비슷했나봄...) 이분탐색으로 배열의 범위를 탐색하는 ..
https://www.acmicpc.net/problem/11399 11399번: ATM 첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000) www.acmicpc.net 풀이 돈을 인출하는 시간을 오름차순으로 정렬 후 각 사람들이 기다리는 값을 더한다. 코드 #include #include #include using namespace std; int main() { int N, n, sum; vector V; scanf("%d", &N); for (int i = 0; i < N; i++) { scanf("%d", &n); V.push_back(n); } sort(V.begin(), V.end(..
https://www.acmicpc.net/problem/2441 2441번: 별 찍기 - 4 첫째 줄에는 별 N개, 둘째 줄에는 별 N-1개, ..., N번째 줄에는 별 1개를 찍는 문제 하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오. www.acmicpc.net 코드 #include int main() { int N; scanf("%d", &N); for (int i = N; i > 0; i--) { for (int j = N; j > i; j--) printf(" "); for (int j = 0; j < i; j++) printf("*"); printf("\n"); } return 0; }
https://www.acmicpc.net/problem/2558 2558번: A+B - 2 첫째 줄에 A, 둘째 줄에 B가 주어진다. (0 < A, B < 10) www.acmicpc.net 코드 #include int main() { int A, B; scanf("%d %d", &A, &B); printf("%d", A + B); return 0; }
https://www.acmicpc.net/problem/11404 11404번: 플로이드 첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 www.acmicpc.net 풀이 문제 이름에서부터 알 수 있듯이 플로이드-와샬을 쓰는 문제다. 문제의 "시작 도시와 도착 도시를 연결하는 노선은 하나가 아닐 수 있다." 는 문구가 있으므로 값을 입력 받는 부분에서도 최솟값을 입력 받아야 한다.다익스트라로도 풀어봤지만 코드 길이와 시간 면에서 플로이드-와샬의 성능이 더 좋다. 코드 1 - 플로이드 #include #include #include using namespace ..
https://www.acmicpc.net/problem/1504 1504번: 특정한 최단 경로 첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존 www.acmicpc.net 풀이 1 ~ v1 ~ v2 ~ N, 1 ~ v2 ~ v1 ~ N의 경로 중 최단 경로를 골라야 한다. 코드 #include #include #include #include using namespace std; #define MAX 100000000 vector V[801]; int Dijkstra(int start, int end, int N) { if..