1. 알고리즘 문제
- 1541번 잃어버린 괄호
// 이예고운
#include <stdio.h>
#include <string.h>
int main() {
char equation[51];
scanf("%s", equation);
int sum = 0;
int temp = 0;
int sign = 1; // 현재 연산의 부호 -> 1은 덧셈, -1은 뺄셈
int length = strlen(equation);
int i = 0;
for (i = 0; i < length; i++) {
if (equation[i] >= '0' && equation[i] <= '9') {
temp = temp * 10 + (equation[i] - '0');
}
else {
sum += sign * temp;
temp = 0;
if (equation[i] == '-') {
sign = -1; // 부호 뺄셈으로 변경
}
}
}
sum += sign * temp;
printf("%d\\n", sum);
return 0;
}
# 정재훈
def minusnanugi(pulma):
parts = pulma.split('-')
ahp = sum(map(int, parts[0].split('+')))
total = ahp
for part in parts[1:]:
psum = sum(map(int, part.split('+')))
total -= psum
return total
pulma = input()
print(minusnanugi(pulma))
- 2156번 포도주 시식
// 이예고운
#include <stdio.h>
#include <stdlib.h>
int max(int a, int b, int c) { // 3개의 항 중 최댓값 구하는 함수
if (a > b) {
return (a > c) ? a : c;
}
else {
return (b > c) ? b : c;
}
}
int main() {
int n;
scanf("%d", &n);
int* wine = (int*)malloc(sizeof(int) * (n + 1));
for (int i = 1; i <= n; i++) {
scanf("%d", &wine[i]);
}
int* dp = (int*)malloc(sizeof(int) * (n + 1));
if (n == 1) {
printf("%d\\n", wine[1]);
return 0;
}
else if (n == 2) {
printf("%d\\n", wine[1] + wine[2]);
return 0;
}
dp[0] = 0;
dp[1] = wine[1];
dp[2] = wine[1] + wine[2];
dp[3] = max(dp[2], wine[1] + wine[3], wine[2] + wine[3]);
for (int i = 4; i <= n; i++) {
dp[i] = max(dp[i - 1], dp[i - 2] + wine[i], dp[i - 3] + wine[i - 1] + wine[i]);
}
printf("%d\\n", dp[n]);
free(wine);
free(dp);
return 0;
}
// 신서윤
#include<stdio.h>
int main() {
int n;
scanf("%d", &n);
int grapezu[10000];
int base = 0;
for (int i = 0; i < n; i++) {
scanf("%d", &grapezu[i]);
base += grapezu[i];
}
int A = base, B = base, C = base;
for (int i = 0; i < n / 3; i++) {
A -= grapezu[i * 3];
B -= grapezu[i * 3 + 1];
C -= grapezu[i * 3 + 2];
}
if (n % 3 == 1) A -= grapezu[n-1];
else if (n % 3 == 2) {
A -= grapezu[n-2];
B -= grapezu[n-1];
}
if (A >= B && A >= C) printf("%d", A);
else if (B >= A && B >= C) printf("%d", B);
else if (C >= B && C >= A) printf("%d", C);
return 0;
}
// 정재훈
#include <stdio.h>
int max(int a, int b) {
return a > b ? a : b;
}
int max3(int a, int b, int c) {
return max(max(a, b), c);
}
int main() {
int n;
scanf("%d", &n);
int wine[10000];
for (int i = 0; i < n; i++) {
scanf("%d", &wine[i]);
}
if (n == 1) {
printf("%d\\n", wine[0]);
return 0;
}
if (n == 2) {
printf("%d\\n", wine[0] + wine[1]);
return 0;
}
int dp[10000];
dp[0] = wine[0];
dp[1] = wine[0] + wine[1];
dp[2] = max3(wine[0] + wine[1], wine[0] + wine[2], wine[1] + wine[2]);
for (int i = 3; i < n; i++) {
dp[i] = max3(dp[i-1], dp[i-2] + wine[i], dp[i-3] + wine[i-1] + wine[i]);
}
printf("%d\\n", dp[n-1]);
}
- 2346번 풍선 터뜨리기
// 이예고운
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int index;
int move;
} Balloon;
int main() {
int n;
scanf("%d", &n);
Balloon* balloon = (Balloon*)malloc(sizeof(Balloon) * n);
for (int i = 0; i < n; i++) {
balloon[i].index = i + 1; // 풍선 번호
scanf("%d", &balloon[i].move); // 이동 값
}
int front = 0;
int rear = n - 1;
int* result = (int*)malloc(sizeof(int) * n);
int result_index = 0;
// 첫번째 풍선 터뜨리기
int current = front; // 현재 위치
int step = balloon[current].move; // 현재 풍선의 이동값
result[result_index++] = balloon[current].index;
while (result_index < n) {
if (step > 0) {
while (step--) {
current = (current + 1) % n;
while (balloon[current].move == 0) {
current = (current + 1) % n; // 터진 풍선 건너뛰기
}
}
}
else {
while (step++) {
current = (current - 1 + n) % n;
while (balloon[current].move == 0) {
current = (current - 1 + n) % n; // 터진 풍선 건너뛰기
}
}
}
result[result_index++] = balloon[current].index;
step = balloon[current].move;
balloon[current].move = 0;
}
for (int i = 0; i < n; i++) {
printf("%d ", result[i]);
}
printf("\\n");
free(balloon);
free(result);
return 0;
}
// 신서윤
#include<stdio.h>
int main() {
int N, start=0, next;
int balloon[1000];
int pang[1000];
int j = 0;
scanf("%d", &N);
int fix = N;
for (int i = 0; i < fix; i++) {
scanf("%d", &balloon[i]);
}
while (N !=1 ) {
next = start;
pang[j++] = start+1;
while (balloon[start] != 0) {
if (balloon[start] > 0) {
next += 1;
if (next >= fix) next -= fix;
if (balloon[next] != 0 && next!=start) {
balloon[start] -= 1;
}
}
else if (balloon[start] < 0) {
next -= 1;
if (next < 0) next += fix;
if (balloon[next] != 0 && next!=start) {
balloon[start] += 1;
}
}
}
start = next;
N -= 1;
}
pang[j++] = start + 1;
for (int i = 0; i < fix; i++) {
printf("%d ", pang[i]);
}
return 0;
}
2. 알고리즘 공부 - 탐색 알고리즘
탐색 알고리즘
- 이분 탐색에 대해 기초를 다짐과 동시에 심화적인 내용을 다루며 이에 대한 코드를 통해 이해도 up