1. 알고리즘 문제

  1. 10866번 덱
// 이예고운
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_SIZE 10000

int deque[MAX_SIZE];
int front_index = 0;
int back_index = 0;

void push_front(int x) { // 덱의 앞에 추가
    front_index = (front_index - 1 + MAX_SIZE) % MAX_SIZE;
    deque[front_index] = x;
}

void push_back(int x) { // 덱의 뒤에 추가
    deque[back_index] = x;
    back_index = (back_index + 1) % MAX_SIZE;
}

int pop_front() { // 덱의 가장 앞에 있는 수 출력하고 제거
    if (front_index == back_index) {
        return -1;
    }
    else {
        int value = deque[front_index];
        front_index = (front_index + 1) % MAX_SIZE;
        return value;
    }
}

int pop_back() { // 덱의 가장 뒤에 있는 수 출력하고 제거
    if (front_index == back_index) {
        return -1;
    }
    else {
        back_index = (back_index - 1 + MAX_SIZE) % MAX_SIZE;
        return deque[back_index];
    }
}

int size() {
    return (back_index - front_index + MAX_SIZE) % MAX_SIZE;
}

int empty() {
    return front_index == back_index ? 1 : 0;
}

int front() { // 덱의 가장 앞에 있는 수 출력
    if (front_index == back_index) {
        return -1;
    }
    else {
        return deque[front_index];
    }
}

int back() { // 덱의 가장 뒤에 있는 수 출력
    if (front_index == back_index) {
        return -1;
    }
    else {
        return deque[(back_index - 1 + MAX_SIZE) % MAX_SIZE];
    }
}

int main() {
    int n;
    scanf("%d", &n);
    char command[MAX_SIZE];
    int x;

    for (int i = 0; i < n; i++) {
        scanf("%s", command);

        if (strcmp(command, "push_front") == 0) {
            scanf("%d", &x);
            push_front(x);
        }
        else if (strcmp(command, "push_back") == 0) {
            scanf("%d", &x);
            push_back(x);
        }
        else if (strcmp(command, "pop_front") == 0) {
            printf("%d\\n", pop_front());
        }
        else if (strcmp(command, "pop_back") == 0) {
            printf("%d\\n", pop_back());
        }
        else if (strcmp(command, "size") == 0) {
            printf("%d\\n", size());
        }
        else if (strcmp(command, "empty") == 0) {
            printf("%d\\n", empty());
        }
        else if (strcmp(command, "front") == 0) {
            printf("%d\\n", front());
        }
        else if (strcmp(command, "back") == 0) {
            printf("%d\\n", back());
        }
    }

    return 0;
}
// 정재훈
#include <stdio.h>

int deque[200001];
int front = 100000;
int back = 100001;

void push_front(int x) {
    deque[front--] = x;
}

void push_back(int x) {
    deque[back++] = x;
}

int pop_front() {
    if (front + 1 == back) return -1;
    return deque[++front];
}

int pop_back() {
    if (front + 1 == back) return -1;
    return deque[--back];
}

int size() {
    return back - front - 1;
}

int empty() {
    return (front + 1 == back) ? 1 : 0;
}

int get_front() {
    if (front + 1 == back) return -1;
    return deque[front + 1];
}

int get_back() {
    if (front + 1 == back) return -1;
    return deque[back - 1];
}

int main() {
    int n;
    scanf("%d", &n);
    char command[20];
    int value;

    for (int i = 0; i < n; i++) {
        scanf("%s", command);
        
        if (command[0] == 'p' && command[1] == 'u' && command[5] == 'f') {
            scanf("%d", &value);
            push_front(value);
        } else if (command[0] == 'p' && command[1] == 'u' && command[5] == 'b') {
            scanf("%d", &value);
            push_back(value);
        } else if (command[0] == 'p' && command[1] == 'o' && command[4] == 'f') {
            printf("%d\\n", pop_front());
        } else if (command[0] == 'p' && command[1] == 'o' && command[4] == 'b') {
            printf("%d\\n", pop_back());
        } else if (command[0] == 's') {
            printf("%d\\n", size());
        } else if (command[0] == 'e') {
            printf("%d\\n", empty());
        } else if (command[0] == 'f') {
            printf("%d\\n", get_front());
        } else if (command[0] == 'b') {
            printf("%d\\n", get_back());
        }
    }

    return 0;
}

  1. 2210번 숫자판 점프
#include <stdio.h>
#include <string.h>

int board[5][5];
int dx[4] = {-1, 1, 0, 0};  
int dy[4] = {0, 0, -1, 1};
int arr[1000000];
int count = 0;

void dfs(int x, int y, int dep, int num) {
    if (dep == 6) {
        if (!arr[num]) {
            arr[num] = 1;
            count++;
        }
        return;
    }

    for (int i = 0; i < 4; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];

        if (nx >= 0 && nx < 5 && ny >= 0 && ny < 5) {
            dfs(nx, ny, dep + 1, num * 10 + board[nx][ny]);
        }
    }
}

int main() {
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            scanf("%d", &board[i][j]);
        }
    }

    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            dfs(i, j, 1, board[i][j]);
        }
    }

    printf("%d\\n", count);
}

  1. 18429번 근손실
// 이예고운
#include <stdio.h>

int n, k;
int count = 0;
int a[50], b[50];

void check(int day, int weight) {
    if (weight < 500) {
        return;
    }
    if (day == n) {
        count++;
        return;
    }

    for (int i = 0; i < n; i++) {
        if (!b[i]) {
            b[i] = 1;
            check(day + 1, weight + a[i] - k);
            b[i] = 0;
        }
    }
}

int main() {
    
    scanf("%d %d", &n, &k);
    
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }

    check(0, 500);

    printf("%d\\n", count);

    return 0;
}
// 정재훈
#include <stdio.h>
#include <string.h>

int kit[8];
int visit[8];
int result;
int n, k;

void find(int len, int check, int d)
{
    if (d == n)
    {
        result++;
        return;
    }

    for (int i = 0; i < len; i++)
    {
        int t = check + kit[i] - k;
        if (visit[i] == 0 && t >= 500)
        {
            visit[i] = 1;
            find(len, t, d + 1);
            visit[i] = 0;
        }
    }
}

int main(void)
{
    scanf("%d %d", &n, &k);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &kit[i]);
    }

    find(n, 500, 0);

    printf("%d", result);
    return 0;
}

  1. 11399번 ATM
// 이예고운
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int compare(const void* a, const void* b) {
    return (*(int*)a - *(int*)b);
}

int main() {
    int n;
    scanf("%d", &n);
    int money[1001];
    for (int i = 0; i < n; i++) {
        scanf("%d", &money[i]);
    }

    qsort(money, n, sizeof(int), compare);

    int temp = 0;
    long long sum = 0;
    for (int i = 0; i < n; i++) {
        temp += money[i];
        sum += temp;
    }

    printf("%lld\\n", sum);

    return 0;
}

// 정재훈
#include <stdio.h>
#include <stdlib.h>

int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

int arr[1001];

int main(void)
{
    int n;
    int sum = 0, answer = 0;
    scanf("%d", &n);
    for (size_t i = 0; i < n; i++)
    {
        scanf("%d",&arr[i]);
    }
    qsort(arr,n,sizeof(arr[0]),compare);

    for (size_t i = 0; i < n; i++)
    {
        sum += arr[i];
        answer += sum;
    }
    printf("%d",answer);
}

// 신서윤
//11399번 실4 ATM

#include<stdio.h>
#include<stdlib.h>

int compare(const void* a, const void* b) {
   if (*(int*)a > *(int*)b) {
      return 1;
   }
   else {
      return -1;
   }
}

int main() {
   int N, sum=0;
   int arr[1000];
   scanf("%d", &N);
   for (int i = 0; i < N; i++) {
      scanf("%d", &arr[i]);
   }
   qsort(arr, N, sizeof(int), compare);
   for (int i = 0; i < N; i++) {
      for (int j = 0; j < i + 1; j++) {
         sum += arr[j];
      }
   }
   printf("%d", sum);

   return 0;
}
  1. 2828번 사과 담기 게임
// 이예고운
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int compare(const void* a, const void* b) {
    return (*(int*)a - *(int*)b);
}

int main() {
    int n, m;
    scanf("%d %d", &n, &m);
    int j;
    scanf("%d", &j);

    int left = 1, right = m, result = 0;
    for (int i = 0; i < j; i++) {
        int apple;
        scanf("%d", &apple);

        if (apple < left) {
            result += (left - apple);
            left = apple;
            right = left + m - 1;
        }
        else if (apple > right) {
            result += (apple - right);
            right = apple;
            left = right - m + 1;
        }
    }

    printf("%d\\n", result);

    return 0;
}

// 신서윤
#include<stdio.h>

int main() {
   int N, M, J, apple;
   scanf("%d %d", &N, &M);
   int left = 1, right = M, distance=0;
   scanf("%d", &J);
   for (int i = 0; i < J; i++) {
      scanf("%d", &apple);
      if (apple >= left && apple <= right) {
         
      }
      else {
         if (apple < left) {
            distance += left - apple;
            left -= left-apple;
            right -= left-apple;
         }
         else {
            distance += apple-right;
            left += apple-right;
            right += apple-right;
         }
      }
   }
   printf("%d", distance);

   return 0;
}

2. 알고리즘 공부 - DFS와 BFS

그래프 이론의 정의

그래프(graph)는 노드(node = 정점(vertex))와 그들을 잇는 간선(edge)로 구성되어 있음 경로란 한 노드에서 그래프의 간선을 지나 다른 노드까지 가는 길을 의미하며 경로의 길이는 경로에 포함된 간선의 개수임.

그래프는 방향성에 따라 유향 그래프무향 그래프로, 그리고 간선에 가중치가 부여된 가중치 그래프와 그렇지 않은 비가중치 그래프로 나뉨. 또한, 그래프의 노드와 간선이 연결된 방식에 따라 트리사이클 같은 특정 구조를 가질 수 있음.

그래프를 탐색하는 방법: **DFS(Depth-First Search, 깊이 우선 탐색)**와 BFS(Breadth-First Search, 너비 우선 탐색)

DFS (Depth-First Search, 깊이 우선 탐색)