목록Algorithm/baekjoon문제풀이 (70)
Dolphins의 HelloWorld
문제 링크 : https://www.acmicpc.net/problem/1080 #include #include using namespace std; int A[50][50]; int B[50][50]; int main() { int N, M; scanf("%d %d", &N, &M); for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { scanf("%1d", &A[i][j]); } } for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { scanf("%1d", &B[i][j]); } } int count = 0; for (int i = 0; i < N-2; i++) { for (int j = 0..
문제링크 : https://www.acmicpc.net/problem/1783 처리하는 방법이 높이에 따라 3가지로 나뉜다. 1. 높이가 1인경우 -> 제자리 말고 이동할 수 있는 칸이 없으므로 갯수는 1 2. 높이가 2인 경우 -> 2칸씩 위, 아래로가는 1번,4번 방법을 쓸 수 없고 4번이상 이동할 경우 모든 방법을 다 써야하므로 제일 많이 가봐야 제자리 1칸 + 이동 3칸 = 4칸이다, 가로 길이가 충분하지 않은 경우 (M+1)/2 하면 칸의 갯수가 되며 min(4,(M+1)/2)를 통해 구해주면 된다. (이해가 안될 경우 직접 그리면서 이해해보자.) 3. 높이가 3인 경우 -> 이 때는 너비가 7이상일 떄와 미만일 때로 경우가 나뉘는데 그 이유는 4가지 방법을 모두 쓰면 기본적으로 가로 7의 거리..
문제 링크 : https://www.acmicpc.net/problem/10610 30 = 3 * 10 이며 10의 배수는 0이 필요하고 3의 배수는 각 자리 숫자의 합이 3의 배수라는 성질이 있으므로 이 성질들을 이용하여 코드를 짜 보았다. #include #include #include using namespace std; int arr[10]; int main() { string N; cin >> N; int sum = 0; memset(arr, 0, sizeof(int) * 10); for (int i = 0; i < N.size(); i++) { int num = N[i] - '0'; sum += num; arr[num]++; } string result = ""; if ((sum % 3 != ..
문제링크 : https://www.acmicpc.net/problem/2875 K가 0이 될 때까지 반복하면서 만약 여자의 수가 남자의 2배보다 크면 여자의 수를 하나씩 낮추었고 그렇지 않다면 남자의 수를 낮추면서 수를 조정하였다. #include using namespace std; int main() { int N, M, K; cin >> N >> M >> K; while (K--) { if (N > 2 * M) N--; else M--; } int result; if (N >= 2 * M) result = M; else result = N / 2; printf("%d\n", result); }
문제링크 : https://www.acmicpc.net/problem/1744 쉬운듯 보이나 의외로 까다로웠던 문제이다. 기본적으로는 음수와 양수별로 나누어 음수는 가장 작은수부터 2개씩 , 양수는 가장 큰 수부터 2개씩 짝을지어 곱해서 더해주면 된다. 그러니까 예를들어 -5 -1 4 2 3 -3 이 있다고 하면 음수는 -5 -3 -1 과 같이 오름차순으로 정렬하여 2개씩 짝지어 곱한 후 더해주고 양수는 4 3 2 와 같이 내림차순으로 정렬하여 2새씩 짝지어 곱한 후 더해주는 식이다. 놓치기 쉬운 부분은 1같은 경우 짝지어 곱해주는 것보다 따로 더해주는게 값을 더 크게한다는 사실이다. 고로 1이 나오는 경우 음수배열에 추가시키지 말고 결과값에 바로 1을 더하도록 한다. 마지막으로 2개씩 짝지어 더하는 과..
문제링크 : https://www.acmicpc.net/problem/1541 한번 마이너스가 나오기 전까지는 값들이 모두 양수로 더해지지만 마이너스가 나오고 난 후에는 그 후의 + 는 모두 - 안에서 괄호로 묶이기 때문에 부호가 무엇이든 빼지는 것으로 생각해도 무방하다. #include #include #include using namespace std; int main() { int result = 0; int first = 0; string str; bool minus = false; cin >> str; int size = str.size(); for (int i = 0; i < size; i++) { if (!minus) { if (str[i] == '+') { result += stoi(str..
문제링크 : https://www.acmicpc.net/problem/11399 생각보다 간단한 문제이다. 오름차순으로 주어진 수들을 정렬한 후 누적해서 더해주면 된다. 나같은 경우에는 for(int i=0; i 이렇게 오름차순으로 정렬된 배열을 배열의 크기 N까지 반복문을 돌릴 때 i번째 배열값이 N-i번 곱해지므로 이렇게 곱해진 것을 더해나갔다. #include #include using namespace std; int arr[1000]; int main() { int N; scanf("%d", &N); for (int i = 0; i < N; i++) scanf("%d", &arr[i]); sort(arr, arr + N); int sum = 0; for (int i = 0; i < N; i++)..
문제링크 : https://www.acmicpc.net/problem/1931 이 문제에 대해 고민을 하다 보면 결국 사용할 수 있는 최대의 회의 수를 출력하기 위해서 회의를 마치는 시간이 중요하다는 것을 알게된다. 회의가 마치는 순서를 오름차순으로 정렬한 후 그 회의가 시작한 시간이 그 전 회의가 끝난 시간과 겹치지 않도록 하면 최대한의 회의 숫자를 구할 수 있다. #include #include #include using namespace std; typedef struct { long long start; long long end; }time; bool cmp(time t1, time t2) { if (t1.end < t2.end) return true; else if (t1.end == t2.en..
문제링크 : https://www.acmicpc.net/problem/11047 위의 문제에서 i>=2인 경우에 A(i)는 A(i-1)의 배수라는 조건이 주어졌으므로 Greedy Algorithm으로 주어진 가장 큰 수부터 시작해서 단위가 큰 돈을 최대한 많이 거슬러주는 식으로 반복문을 작성한다면 쉽게 문제를 풀 수 있다. #include #include using namespace std; vector v; int main() { int N; long long K; cin >> N >> K; long long num; while (N--) { scanf("%lld", &num); v.push_back(num); } long long count = 0; for (int i = v.size() - 1; i..
문제 링크 : https://www.acmicpc.net/problem/1967 트리의 지름을 구하기 위해서는 먼저 기준점을 잡아야되는데 기준점을 잡기위해 루트로부터 가장 길이가 긴 점을 선택한다. 기준점을 잡은 후 기준점으로부터 트리를 탐색하면서 거리의 최댓값을 구하면 답을 구할 수 있다. #include #include #include #include #define SIZE 10001 using namespace std; typedef struct __NODE { int next = -1; int cost = -1; }node; //다음 노드와 가중치 저장 vector v[SIZE]; bool check[SIZE]; pair p = make_pair(0,0); void function(int star..