gabriel227
2022.02.25
@gabriel227님이 새 포스트를 작성했습니다.
C언어 문제은행 - 외판원 순회 - 15일차
문제를 풀지 못해 풀이방법을 검색하여 찾아보았다. dfs + dp에 대한 개념과 사용 방법에 대해 공부할 수 있는 기회였다. https://yabmoons.tistory.com/358 #include<iostream> #include<cstring>   #define endl "\n" #define MAX 16 #define INF 987654321 using namespace std;   int N, Answer_Bit; int MAP[MAX][MAX]; int Cost[MAX][1 << MAX];   int Min(int A, int B) { if (A < B) return A; return B; }   void Input() {     cin >> N;     for (int i = 0; i < N; i++)     {         for (int j = 0; j < N; j++)         {             cin >> MAP[i][j];         }     }     Answer_Bit = (1 << N) - 1; }   int DFS(int Cur_Node, int Cur_Bit) {     if (Cur_Bit == Answer_Bit)     {         if (MAP[Cur_Node][0] == 0) return INF;         else return MAP[Cur_Node][0];     }       if (Cost[Cur_Node][Cur_Bit] != -1) return Cost[Cur_Node][Cur_Bit];     Cost[Cur_Node][Cur_Bit] = INF;          for (int i = 0; i < N; i++)     {         if (MAP[Cur_Node][i] == 0) continue;         if ((Cur_Bit & (1 << i)) == (1 << i)) continue;                  Cost[Cur_Node][Cur_Bit] = Min(Cost[Cur_Node][Cur_Bit], MAP[Cur_Node][i] + DFS(i, Cur_Bit | 1 << i));     }     return Cost[Cur_Node][Cur_Bit]; }   void Solution() {     memset(Cost, -1, sizeof(Cost));     cout << DFS(0, 1) << endl; }   void Solve() {     Input();     Solution(); }   int main(void) {     ios::sync_with_stdio(false);     cin.tie(NULL);     cout.tie(NULL);       //freopen("Input.txt", "r", stdin);     Solve();       return 0; } 출처: https://yabmoons.tistory.com/358 [얍문's Coding World..]
gabriel227
2022.02.25
@gabriel227님이 새 포스트를 작성했습니다.
C언어 문제은행 - 회의실 배정 - 15일차
풀이를 계속 해보았으나 코드를 완성하지 못해 완성된 코드를 첨부합니다. https://angangmoddi.tistory.com/34 #include<stdio.h> #include<stdlib.h> typedef struct discussion { int start, end; }Discussion; int compare(const void*, const void*); int main() { int n, i, cnt = 0, t1, t2, last = 0; scanf("%d", &n); Discussion* dis; dis = (Discussion*)calloc(n, sizeof(Discussion)); for (i = 0; i < n; i++) { scanf("%d %d", &t1, &t2); dis[i].start = t1; dis[i].end = t2; } qsort(dis, n, sizeof(Discussion), compare); for (i = 0; i < n; i++) { if (dis[i].start >= last) { cnt++; last = dis[i].end; } } printf("%d", cnt); free(dis); return 0; } int compare(const void* a, const void* b) { const Discussion* n1, * n2; n1 = (const Discussion*)a; n2 = (const Discussion*)b; if (n1->end != n2->end) { if (n1->end < n2->end) { return -1; } else if (n1->end == n2->end) { return 0; } else { return 1; } } else { if (n1->start < n2->start) { return -1; } else if (n1->start == n2->start) { return 0; } else { return 1; } } }
gabriel227
2022.02.24
@gabriel227님이 새 포스트를 작성했습니다.
C언어 문제은행 - 미로찾기 - 14일차
bfs에 대한 개념을 공부하였으나 자신의 힘으로는 풀지 못해 풀이가 된 코드를 공유합니다. https://iamthejiheee.tistory.com/13 #define MOD 10000 #define SZ 101 int i, j, N, M;   int map[SZ][SZ]; int visit[SZ][SZ];     struct node {     int x;     int y; };   struct node queue[MOD + 1]; int tail = 0; int head = 0; int max = 0;   int vectX[4] = { 0,0,1,-1 }; int vectY[4] = { 1, -1, 0, 0 };     struct node deque() {     struct node temp = queue[head];     head = (head + 1) % MOD;     return temp; }   int isQueEmpty() {     if (head == tail) {         return 0;     }     return 1; }   void enque(int x_, int y_) {     struct node temp;     temp.x = x_;     temp.y = y_;     queue[tail] = temp;     tail = (tail + 1) % MOD; }   void do_BFS() {     int nextX;     int nextY;     while (isQueEmpty() == 1) {                  // 다음 방문할 노드 : [nextX][nextY]         struct node k = deque();           for (i = 0; i < 4; i++) {             nextX = k.x + vectX[i];             nextY = k.y + vectY[i];               //방향값 확인             if (nextX >= 1 && nextX <= M && nextY >= 1 && nextY <= N) {                          // [nextX][nextY]까지 가는 길이 있고 한번도 방문하지 않은 노드인 경우 => queue에 넣는다.                 if (map[nextX][nextY] == 1) {                     if (visit[nextX][nextY] == 0) {                         //[x][y] 에서 [nextX][nextY]까지 가는데 걸리는 노드 개수                         visit[nextX][nextY] = visit[k.x][k.y] + 1;                         enque(nextX, nextY);                     }                 }             }         }     } }   int main() {     scanf("%d %d", &M, &N);     for (i = 1; i <= M; i++) {         for (j = 1; j <= N; j++) {             scanf("%1d", &map[i][j]);         }     }       visit[1][1] = 1;     enque(1, 1);     do_BFS();     printf("%d\n", visit[M][N]);   }
gabriel227
2022.02.24
@gabriel227님이 새 포스트를 작성했습니다.
C언어 문제은행 - 소수만들기 - 14일차
#include <stdio.h> int isnp[100000] = {1,1}; char n[300]; int si(int s,int e){        int num = 0, i;        for(i = s; i <= e; i++)         num = num * 10 + (n[i] - 48);        return num; } int main(){    int ans, i, j;     scanf("%s",n);     for(i = 2; i < 100000; ++i)         if(!isnp[i])             for(j = i + i; j < 100000; j += i)                 isnp[j] = 1;          ans = 0;          for(i = 0; i < strlen(n); ++i)         for(j = i; j < i + 6 && j < strlen(n); ++j){             int num = si(i,j);             if(num <= 100000 && !isnp[num])                 ans = ans > num?ans:num;         }        printf("%d",ans); }
gabriel227
2022.02.23
@gabriel227님이 새 포스트를 작성했습니다.
C언어 문제은행 - 이어져 있나요? - 13일차
https://blog.naver.com/ndb796/221234427842의 플로이드 와샬 알고리즘을 참고했습니다. #include <stdio.h> #define INF 1000 #define MIN(a,b) a<b?a:b int arr[100][100];   int main() {     int N;     scanf("%d", &N);       for (int i = 0; i < N; i++) {         for (int j = 0; j < N; j++) {             scanf("%d", &arr[i][j]);             if (arr[i][j] == 0) arr[i][j] = INF;         }     }       for (int k = 0; k < N; k++) {         for (int i = 0; i < N; i++) {             for (int j = 0; j < N; j++) {                 arr[i][j] = MIN(arr[i][j], arr[i][k] + arr[k][j]);             }         }     }     for (int i = 0; i < N; i++) {         for (int j = 0; j < N; j++) {             if (arr[i][j] == INF) printf("0 ");             else printf("1 ");         }         printf("\n");     }         return 0; }
gabriel227
2022.02.21
@gabriel227님이 새 포스트를 작성했습니다.
c언어 문제은행 - [Challenge!] 스도쿠 - 11일차
#include<stdio.h> int main(void)  {    int x[9][9], sum, q = 0, w = 0;   for(int i = 0; i < 9; i++)     {       for(int j = 0; j < 9; j++)         {           scanf("%d", &x[i][j]);         }     }   for(int i = 0; i < 9; i++)     {       sum = 0;              for(int j = 0; j < 9; j++)         {           sum += x[i][j];         }       if(sum != 45)       {         printf("입력하신 스도쿠는 오답입니다.");         return 0;        }     }   for(int i = 0; i < 9; i++)     {       sum = 0;              for(int j = 0; j < 9; j++)         {           sum += x[j][i];         }       if(sum != 45)       {         printf("입력하신 스도쿠는 오답입니다.");         return 0;        }     }          for(int k = 0; k < 9; k++)       {         int sum = 0;           for (int i = w; i < w + 3; i++)           {             for (int j = q; j < q + 3; j++)               {                 sum += x[i][j];                 }             }           if(sum != 45)       {         printf("입력하신 스도쿠는 오답입니다.");         return 0;        }                  if (q < 6)         {             q += 3;         }         else         {             w += 3;             q = 0;         }     }     printf("입력하신 스도쿠는 정답입니다.");     return 0;  }
gabriel227
2022.02.21
@gabriel227님이 새 포스트를 작성했습니다.
C언어 문제은행 - 가위바위보 게임 - 11일차
#include<stdio.h> #include<stdlib.h> void in(int x) {   if(x == 1)   {     printf("가위\n");   }    if(x == 2)   {     printf("바위\n");   }    if(x == 3)   {     printf("보\n");   } } int main(void)  {    printf("**************** 가위 바위 보 게임 ****************\n");   int x, random;      while(1)     {       printf("1. 가위 2. 바위 3. 보\n");       printf("입력해주세요 : ");       scanf("%d", &x);       random = rand() % 3 + 1;       printf("컴퓨터 : ");       in(random);       printf("사용자 : ");       in(x);              if(random == x)       {         printf("비겼습니다.\n");       }       else if((random == 3 && x == 1) || random + 1 == x)       {         printf("이겼습니다.\n");       }       else       {         printf("졌습니다.ㅠㅠ\n");       }     }      return 0;  }
gabriel227
2022.02.17
@gabriel227님이 새 포스트를 작성했습니다.
C언어 문제은행 - 원래 숫자 구하기 - 9일차
만약 입력받은 수가 10으로 나누어지는 수일 경우 무한루트에 빠지게 됩니다. 수정이 가능한 방법이 있다면 연락 부탁드립니다. #include <stdio.h> int main() {   int x, a = 0, b = 0, c = 0, sum = 0;      scanf("%d", &x);      a = x;      while(1)     {       sum++;       if(a / 10 > 0)       {         b = a % 10;         a /= 10;       }       else       {         b = a;       }       c = a + b;       if(c / 10 > 0)       {         c %= 10;       }       a = (b * 10) + c;              if(a == x)       {         printf("%d", sum);         return 0;       }     } }
gabriel227
2022.02.16
@gabriel227님이 새 포스트를 작성했습니다.
C언어 문제은행 - 통계학 - 8일차
#include <stdio.h>  int main(void) {   float y, max = 0, min = 100, sum = 0, temp, z[100] = {0, }, mid;   int x;      scanf("%d", &x);   for(int i = 0; i < x; i++)   {     scanf("%f", &y);        sum += y; //산술평균 구하기 위해 더해주기          if(max <= y) //범위 구하기 위해 최대값 최솟값 구하기     {       max = y;     }     if(min >= y)     {       min = y;     }      z[i] = y; //중앙값 구해주기 위해 배열에 숫자 넣어주기   }   for(int q = 0; q < x - 1; q++) //버블정렬 이용하여 오름차순 정렬   {     for(int w = 0; w < x - 1 - q; w++)       {         if(z[w] > z[w+1])         {           temp = z[w];           z[w] = z[w+1];           z[w+1] = temp;         }       }   }      if(x % 2 == 0) //짝수일 때 홀수일 때 가정하기   {     mid = (z[x/2 - 1] + z[x/2]) / 2;   }   else   {     mid = z[x/2];       }          printf("산술평균:%f\n", sum / x);   printf("중앙값:%f\n", mid);   printf("범위:%.0f\n", max - min);      return 0; }
gabriel227
2022.02.14
@gabriel227님이 새 포스트를 작성했습니다.
C언어 문제은행 - 분수의 연산 - 6일차
사칙연산 4가지를 if문으로 따로 계산하였습니다. 기약분수의 꼴로 바꾸는 문장은 따로 추가하였습니다. #include <stdio.h> int main(void) { int a, b, c, d, i; char e; scanf("%d/%d%c%d/%d", &a, &b, &e, &c, &d); if(e == '+') { i = b; a *= d; b *= d; c *= i; a += c; c = a; } else if(e == '-') { i = b; a *= d; b *= d; c *= i; a -= c; c = a; } else if(e == '*') { a *= c; b *= d; c = a; } else if(e == '%') { a *= c; b *= d; c = a; } if(a >= b) //최대 공약수를 구하는 코드 { for(int i = b; i >= 2; i--) { if(a % i == 0 && b % i == 0) { a /= i; b /= i; } } } else { for(int i = a; i >= 2; i--) { if(a % i == 0 && b % i == 0) { a /= i; b /= i; } } } printf("%d/%d", a, b); return 0; }
gabriel227
2022.02.04
@gabriel227님이 새 포스트를 작성했습니다.
C 언어 문제은행 - 두 숫자 사이의 n의 배수 찾기 - 1일차
#include <stdio.h> #include <stdlib.h> //문자열 함수를 사용하기 위한 추가 헤더 파일 int main(void) { char x[10], y[10]; int num, numa, numb; printf("숫자 두 개를 입력해주세요(ex. '3 5'): "); //숫자 두개를 문자열로 받아옴 scanf("%s %s", x, y); printf("배수를 알고 싶은 숫자를 입력해주세요: "); //정수형으로 받아옴 scanf("%d", &num); numa = atoi(x); //atoi를 이용하여 문자열을 정수형으로 변환 numb = atoi(y); for(int i = numa; i < numb; i++) //작은 숫자부터 큰 숫자까지 반복 { if(i % num == 0) //배수를 알고 싶은 숫자가 있을 경우 출력 { printf("%d ", i); } } return 0; }