pk7912
2022.02.27
@pk7912님이 새 포스트를 작성했습니다.
회의실 배정
문제 회사에 한 개의 회의실이 존재하고, N개의 회의에 대해서 일정표를 구성하려고 합니다. 각 회의 A에 대해 시작 시간과 종료시간이 주어져 있을 때, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보세요. 회의는 한번 시작하면 중간에 중단될 수 없다. 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 첫째 줄에는 회의의 수 N이 주어지며, 둘째 줄 부터 N개의 회의에 대한 시작시간과 종료시간이 주어진다. 입/출력 예시 👉 입력예시 11 1 4 2 13 3 5 0 6 5 7 3 8 5 9 6 10 8 11 8 12 12 14 👉 출력예시 4 # [1, 4], [5, 7], [8, 11], [12, 14] #include <stdio.h> #include <string.h> void cal(int a, int b[]) { int con[a]=0; for(int i=0; i<a;i++) { if(con[i]==0){ int start=b[i]/100; int finish=(b[i]%100)*100; if(0<finish<1) { start=(finish*10)/10; finish=(finish*100)%10*10;} con[start]=1; con[finish]=1; } if(con[i]==1) {printf("%d\n", time[i]} } int main() { int count=0; int time[]=0; scanf("%d", &count); for(int i=0; i<count; i++) { scanf("%d %d", time[i]); } cal(count, time); return 0; }
pk7912
2022.02.24
@pk7912님이 새 포스트를 작성했습니다.
소수만들기
양의 정수 N을 입력받아, N의 부분 문자열 중 가장 큰 소수를 출력하세요. 입/출력 예시 👉 입력예시 1226406 👉 출력예시 2 👉 입력예시 91321150 👉 출력예시 1321 👉 입력예시 112 👉 출력예시 11 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int arr[100001] = { 1,1 }; char n[256]; 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 p, len, i, j;     scanf("%s", n);     for (i = 2; i < 100001; ++i)         if (!arr[i])             for (j = i + i; j < 100001; j += i)                 arr[j] = 1;     p = 0;     len = strlen(n);     for (i = 0; i < len; ++i)         for (j = i; j < i + 6 && j < len; ++j) {             int num = si(i, j);             if (num <= 100000 && !arr[num])                 p = p > num ? p : num;         }     printf("%d", p); }
pk7912
2022.02.23
@pk7912님이 새 포스트를 작성했습니다.
이진탐색
문제 이진 탐색 알고리즘을 통해 특정 정수가 몇 번째에 존재하는지 찾는 프로그램을 작성해보세요. 이진 탐색 알고리즘 배열 내에서 찾고싶은 요소가 있을 경우, 아래와 같이 배열의 첫번째 요소와 마지막 요소를 각각 left, right로 설정합니다. 찾고싶은 값을 중간(가운데 순서)에서부터 비교합니다. 만약 찾고싶은 값이 중간에 있는 값보다 크다면, 그 값은 아래 그림과 같은 범위 내에 존재하게 됩니다. 만약 찾고싶은 값이 중간에 있는 값보다 작다면, 그 값은 아래 그림과 같은 범위 내에 존재하게 됩니다. 앞의 과정을 여러번 반복하여 찾고싶은 값이 중앙값과 같아질 때까지 반복하면 찾고싶은 수의 순서를 알 수 있습니다. 입력받는 숫자들은 정수이며, 배열로 입력받습니다. 이때, 각 숫자는 오름차순으로 입력됩니다. 중복된 값을 입력받지 않습니다. 만약 찾는 값이 존재하지 않는다면 -1을 출력합니다. 첫 줄에는 정수의 개수 N, 둘째줄에는 N개의 정수가 오름차순으로 주어진다. 다음 줄에는 목표 값 X가 주어질 때, X가 수열에 존재하는지 여부를 출력하세요. 👉 입력예시 5 1 2 3 4 5 9 👉 출력예시 0 👉 입력예시 5 1 2 3 4 5 1 👉 출력예시 1 #include <stdio.h> #include <stdlib.h> int* list; int searchBinary(int key, int low, int high) { int mid; while (low <= high) { mid = (low + high) / 2; if (key == list[mid]) return mid; else if (key > list[mid]) low = mid + 1; else high = mid - 1; } return -1; } int main(void) { int n, key; scanf("%d", &n); list = (int*)malloc(sizeof(int) * n); for (int i = 0; i < n; i++) scanf("%d", &list[i]); scanf("%d", &key); if (searchBinary(key, 0, n) == -1) printf("0\n"); else printf("1\n"); }
pk7912
2022.02.22
@pk7912님이 새 포스트를 작성했습니다.
n번째 분수
문제 아래 그림과 같이, 배열에 다음과 같은 분수가 적혀있습니다. 그림처럼 지그재그 형태로 순서를 정할 경우, 1/1은 첫 번째, 1/2는 두 번째 분수가 됩니다. n번째 분수를 구하는 프로그램을 작성해보세요 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main(void) { int R[100] = { 0, }; int C[100] = { 0, }; int A = 0, B = 0; int bunmo = 1, bunza = 1; int sum = 0; int N; printf("숫자를 입력하세요~ : "); scanf("%d", &N); while (N >= A) { for (int i = 0; i <= sum; i++) { if (sum % 2 == 0) { R[A++] = bunza + sum - i; C[B++] = bunmo + i; } else { C[B++] = bunza + sum - i; R[A++] = bunmo + i; } } sum++; } if (N > 1) printf("%d/%d", R[N - 1], C[N - 1]); else printf("1/1"); return 0; }
pk7912
2022.02.21
@pk7912님이 새 포스트를 작성했습니다.
알파벳의 거리
문제 알파벳 거리란, 'A' = 1, 'B' = 2, ... 'Z' = 26과 같은 방식으로 알파벳에 숫자를 할당한 뒤 계산되는 거리를 의미합니다. 예를 들어, 'B'와 'D'의 거리는 4-2 = 2 가 되죠. 길이가 같은 두 단어가 주어졌을 때, 각 단어에 포함된 모든 글자의 알파벳 거리의 합을 구하세요. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main() {   int i,sum = 0;     char W1[100], W2[100];     printf("알파벳으로 두단어를 입력하세요 : \n");     scanf("%s %s", W1,W2);     for (i = 0; W1[i] != 0; i++)     {        sum += abs(W1[i] - W2[i]);     }     printf("알파벳 거리의 합은 : %d", sum);     return 0; }
pk7912
2022.02.19
@pk7912님이 새 포스트를 작성했습니다.
정상 정복
문제 달팽이는 높이가 N인 나무를 올라가고있습니다. 달팽이는 낮에는 A미터를 올라갈 수 있지만, 밤에 휴식을 취하면서 B미터 미끄러져 내려옵니다. 달팽이가 나무 정상에 도달하기 위해선 며칠이 걸릴까요? 첫번째 줄에 A, B, N이 공백으로 구분되어 주어집니다. 정상에 도달하는게 불가능할 경우, -1을 출력하세요. #define CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() {     int A, B, N, day, count;     day = 1;     count = 0;     printf("달팽이는 높이가 N인 나무를 올라가고있습니다.\n");     printf("달팽이는 낮에는 A미터를 올라갈 수 있지만, 밤에 휴식을 취하면서 B미터 미끄러져 내려옵니다.\n");     printf("달팽이가 나무 정상에 도달하기 위해선 며칠이 걸릴까요?\n");     printf ("달팽이가 낮에 올라가는 A미터, 밤에 미끄러지는 B미터, 나무의 높이N을 각각 입력하세요(ex)2 1 5 : \n\n");     scanf("%d %d %d", &A, &B, &N);     if(A <= B && A < N) printf("-1");       // 올라간 거리보다 미끄러진 거리가 더 크거나 몰라간 거리가 나무길이보다 작으면 정상에 도달하지 못했기때문에 -1출력     else {                          // (A >= B && A > N) 라면 if조건과 반대라면         while(1) {                  //  무한루프             count += A;             //  참일때 올라간 거리 +             if (count >= N) {       // 만약 올라간 거리가 나무 길이보다 크다면 탈출                 break;             }             count -= B;             //  참일때 내려간 거리 +             day++;                  //  루프 한바퀴돌때마다 1을 더해준다-- 일수가 되는식         }         printf("%d", day);     }     return 0; }
pk7912
2022.02.17
@pk7912님이 새 포스트를 작성했습니다.
상근수
문제 양의 정수 n의 각 자리수 제곱의 합을 계산한다. 그렇게 해서 나온 합도 각 자리수의 제곱의 합을 계산한다. 이렇게 반복해서 1이 나온다면, 해당 수는 상근수 라고 한다. 700은 상근수 이다. 2는 상근수가 아니다. 양의 정수 N이 입력으로 주어졌을 때, N보다 작거나 같은 모든 상근수를 구해 출력 해 보세요. #define CRT_SECURE_NO_WARNINGS #include <stdio.h> int San(int n); int main() { int a; scanf("%d", &a); for (int i = 1; i <= a; i++) { if (San(i)) printf("%d ", i); } printf("\n"); } int San(int n) { int sum = 0; while (1) { if (sum == 1) return 1; else if (sum == 4) return 0; sum = 0; while (n / 10 != 0) { sum += (n % 10) * (n % 10); n /= 10; } sum += n * n; n = sum; } }
pk7912
2022.02.16
@pk7912님이 새 포스트를 작성했습니다.
뒤집은 소수
문제 여러 숫자를 입력받고, 각 숫자가 뒤집었을 때 소수이면 출력을 하는 프로그램을 만들어보세요. 조건 1 : 숫자를 뒤집었을 때 소수이면 출력을 합니다 (ex. 32를 뒤집었을 때 23이고, 23은 소수이므로 출력) 조건 2 : 최소 두 개 이상의 함수를 사용해주세요. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> int     isPrime(int num) //소수인지 판별하는 함수 {     for (int i = 2; i < num; i++) {         if (num % i == 0)             return (0);     }     return (1); } void    swap(char* a, char* b) //문자 두개의 위치를 바꿔주는 함수 {     char    tmp = *a;     *a = *b;     *b = tmp; } int     reverse(int num) //숫자를 뒤집어서 리턴하는 함수 {     char    str[100];     int     len;     sprintf(str, "%d", num); //정수 num을 문자열 str로 변환     len = strlen(str);     for (int i = 0; i < len / 2; i++) {         swap(&str[i], &str[len - i - 1]);     }     return atoi(str); } int     main(void) {     int num;     printf("입력받을 숫자의 개수를 입력해주세요:");     scanf("%d", &num);     int* arr = malloc(sizeof(int) * num);     for (int i = 0; i < num; i++) {         printf("각 %d번째 숫자를 입력해주세요 : ", i);         scanf("%d", &arr[i]);     }     for (int i = 0; i < num; i++) {         if (isPrime(reverse(arr[i])))             printf("%d ", arr[i]);     }     free(arr);     return (0); }
pk7912
2022.02.14
@pk7912님이 새 포스트를 작성했습니다.
분수의 연산
문제 두 분수의 연산을 입력받고, 그 값을 계산하여 출력하는 프로그램을 작성해주세요. 조건 1 : 분모가 0인 경우는 고려하지 않습니다. 조건 2 : 계산이 끝난 분수의 값은 기약분수의 형태로 출력해주세요. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main(void) {     int a, b, c, d;     char e;     int i;     printf("분수식을 입력하세요\n");     scanf_s("%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\n", a, b);     return 0; }
pk7912
2022.02.10
@pk7912님이 새 포스트를 작성했습니다.
자리수의 합
문제 5개 자연수를 입력받은 후, 각 입력된 숫자들 중 자릿수의 합이 가장 큰 수를 구해보세요. (713의 자릿수의 합) = 7 + 1 + 3 = 11 / (112의 자릿수의 합) = 1 + 1+ 2 = 4 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() {     int num[5] = { 0 };     int num_arr[5];     int i, temp, max, sum = 0, a = 0;        printf("5개의 자연수를 입력하세요.\n");     for (i = 0; i < 5; i++)     {         scanf_s("%d", &num[i]);         a = num[i];         while (a != 0)         {             sum += a % 10;             a /= 10;         }         num_arr[i] = sum;         sum = 0;     }     temp = num_arr[0];     max = num[0];     for (i = 1; i < 5; i++)     {         if (temp < num_arr[i])         {             max = num[i];             temp = num_arr[i];         }     }     printf("\n%d\n", max); }
pk7912
2022.02.09
@pk7912님이 새 포스트를 작성했습니다.
가운데 글자 찾기
문제 단어를 입력받고, 입력받은 단어의 가운데 글자를 찾는 코드를 작성해보세요. 조건 1 : 단어의 길이가 홀수이면 가운데 글자 하나를 출력합니다. 조건 2 : 단어의 길이가 짝수이면 가운데 글자 두 개를 출력합니다. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main() { int len; char word[500] = {'\0'}; char* s = word; printf("단어를 입력하세요. : "); /*scanf("%s", word);*/ gets(word); len= strlen(s); char* answer = (char*)malloc(sizeof(word) + 1); memset(answer, 0, sizeof(word)+1); if (answer == '\n') { printf("동적할당 실패\n"); return -1; } if (len % 2 != 0) { answer[0] = s[len / 2]; } else { answer[0] = s[len / 2 - 1]; answer[1] = s[len / 2]; } printf("%s", answer); free(answer); return 0; } // 쓸데없이 어렵게 생각했나봐요 ㅠㅠ int main() { char word[500] = { 0, }; int len = 0; printf("단어를 입력하세요. : "); scanf("%s", word); len = strlen(word); if (len % 2 != 0) printf("%c\n", word[len / 2]); else printf("%c%c\n", word[len / 2 - 1], word[len / 2]); return 0; }
pk7912
2022.02.08
@pk7912님이 새 포스트를 작성했습니다.
소인수 분해
문제 정수를 소수의 곱만으로 표현하는 것을 소인수분해라고 합니다. 소인수분해 프로그램을 작성해보세요. ⭐ 힌트 👉 소인수분해 과정 예시 (숫자 12를 소인수분해하는 과정) 먼저, 숫자 12를 가장 작은 소수인 2로 나눕니다. 12은 2로 나누어떨어지므로, 2는 12의 소인수입니다. → 2 12을 2로 나눈 값 6을 다시 2로 나눕니다. 6은 2로 나누어떨어지므로, 2는 6의 소인수입니다. → 2 6을 2로 나눈 값 3을 다시 2로 나눕니다. 3은 2로 나누어떨어지지 않습니다. 3을 2 다음으로 작은 소수인 3으로 나눕니다. 3은 3으로 나누어떨어지므로 3은 소인수입니다. →3 3을 3으로 나눈 값은 1인데, 나누는 수 3이 나눠지는 수 1보다 크기 때문에 계산을 종료합니다. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { // 소인수 분해란 자연수를 소인수들 (2, 3, 5, 7) 만의 곱으로 나타내는 것. int a, b = 2; // 초기화 printf("숫자를 입력해주세요: "); scanf_s("%d", &a); printf("\n"); while (1) // 1= 참일 경우 탈출 { while (a % b != 0) b++; // a 를 b 로 나눈 나머지가 0이 아닐때 탈출 ---> a 를 b 로 나눈 나머지가 0일때는 b + 1 printf("%d\n", b); // a 를 b 로 나눈 나머지가 0일때는 b를 출력 a = a / b; // a = a를 b로 나눈 몫 if (a == 1) break; //(만약 나눈 몫이 1 일때는 탈출) } printf("\n"); return 0;  }
pk7912
2022.02.08
@pk7912님이 새 포스트를 작성했습니다.
+ 연산자
문제 더하기(+) 기호로 표현된 숫자 표현식이 문자열 형태로 주어졌을 때, 이 식을 연산하는 프로그램을 작성해보세요. 조건 1 : 연산의 종류는 덧셈만 존재합니다. 조건 2 : 입력받는 문자열의 길이는 50을 넘지 않습니다. 조건 3 : 숫자의 개수는 최대 10개이며 모두 정수입니다. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> // strtok 함수가 선언된 헤더 파일 #include <stdlib.h> // atoi 함수가 선언된 헤더 파일 int main() {     char a[51];     int result = 0;     printf("더하기(+) 기호로 표현된 숫자 표현식을 입력하세요. (ex = 1+1) : ");     scanf("%s", a);     char* plus = strtok(a, "+");         // 연산자를 기준으로 문자열 분리     while (plus != '\0')        // 반복문을 이용한 계산     {         result += atoi(plus);         plus = strtok('\0', "+");     }     printf("연산 결과 : %d", result);     return 0; } atoi() : 문자형을 숫자형으로 변환 이 변환 함수를 사용자 정의함수로 문자를 숫자로 바꾸기 int atoiSub(char *str){ int tmp=0; while(*str){ tmp=tmp*10+(int)(*str-48); str++; } } ## 숙제 strtok 알아보기! 문자열 자르기
pk7912
2022.02.05
@pk7912님이 새 포스트를 작성했습니다.
3월 달력 출력하기
문제 반복문과 조건문을 활용하여 2021년 3월의 달력을 출력해보세요. 조건 1 : 3월의 마지막 날은 31일이며, 3월 1일은 월요일입니다. 조건 2 : 달력은 일요일부터 시작되며, 날짜 위에 요일 표시를 출력해야 합니다. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int leap_check(int year); int main() { int year, mon, tot = 0; // 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12 int month[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int i; // 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11 printf("년, 월 입력 : "); scanf_s("%d %d", &year, &mon); for (i = 1; i < year; i++) { if (leap_check(i)) tot += 366; else tot += 365; } for (i = 0; i < mon - 1; i++) { tot += month[i]; } if (leap_check(year) && (mon >= 3)) tot++; tot++; // 1을 더해야 구하고자하는 달의 달력을 출력할수 있음 printf("\n\t\t\t<%d년 %d월>\n\n", year, mon); printf("-----------------------------------\n"); printf("   일   월   화   수   목   금   토\n"); printf("-----------------------------------\n"); int start, end; start = tot % 7; //시작하는 날짜 위치 변수 7로 나눈 나머지 값 뒤요일 부터 시작한다는 변수처리 end = month[mon - 1]; if (leap_check(year) && mon == 2) end++; for (i = 0; i < start; i++) // 일요일이 인덱스 0임 그래서 0부터 // 시작 날짜 까지 공간처리하는 범위 7로 나눈 나머지 만큼 뛰우고 시작한다 그래야 정확한 요일에 시작함 ex) 0, 1, 2, 3, 4, 5, 6 printf("     "); for (i = 1; i <= end; i++)  // 요일 설정 ex) 1~31일 까지 표시 { printf("%5d", i); if ((i + start) % 7 == 0) // 시작하는 날짜 부터 해야 되니깐 띄워야되는(start)날 + i(1일,2일,....) 그래야 시작하는 날짜까지 계산하면 7의 배수일때 칸 내림 printf("\n"); } return 0; } int leap_check(int year) { if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) return 1; else return 0; }