1. 알고리즘 문제

  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))
  1. 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]);
}

  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. 알고리즘 공부 - 탐색 알고리즘

탐색 알고리즘