week7 (실습 문제)
2025. 5. 28. 22:08ㆍ프로그래밍1및실습
LED Sign
- ASCII table에 포함된 문자열들로 구성된 문장을 입력받아서, 글자들이 왼쪽으로 한 글자씩 흘러가는 LED 전광판처럼 출력해 주세요.
- 첫 행에는 입력받은 문자열을 그대로 출력한 후, 다음 줄부터는 한 줄에 한 글자씩 왼쪽으로 움직인 결과를 출력하세요.
- 원래 입력받은 문자열이 출력되기 직전까지만 출력하세요.
- 문자열의 첫 칸 혹은 마지막 칸의 공백도 누락되지 않고 출력되도록 주의하세요.
- 입력 받은 문자열의 길이는 최대 1000글자를 넘지 않는다고 가정합니다.
입력1
C Programming language
출력1
C Programming language Programming languageC Programming languageC rogramming languageC P ogramming languageC Pr gramming languageC Pro ramming languageC Prog amming languageC Progr mming languageC Progra ming languageC Program ing languageC Programm ng languageC Programmi g languageC Programmin languageC Programming languageC Programming anguageC Programming l nguageC Programming la guageC Programming lan uageC Programming lang ageC Programming langu geC Programming langua eC Programming languag
정답 코드
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> void run(char a[], int n) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf("%c", a[(i + j) % n]); } printf("\n"); } } int main() { char c[1004]; fgets(c, 1004, stdin); c[strcspn(c, "\n")] = '\0'; run(c, strlen(c)); }
Pattern Counter
- 두 개의 문자열(str와 pat)을 입력 받아서 str 내에 pat 문자열이 몇 개 존재하는지 숫자를 출력하세요.
- 알파벳의 대소문자를 구분합니다.
- 영문 알파벳과 기호까지 입력받을 수 있다고 가정합니다.
- 최대 1000개의 character로 구성된 입력까지만 들어온다고 가정합니다.
입력1
Mathematician ma
출력1
1
입력2
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. dolor
출력2
4
정답 코드#include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> #include<stdbool.h> int main() { char s[1004]; fgets(s, 1004, stdin); s[strcspn(s, "\n")] = '\0'; char e[1004]; fgets(e, 1004, stdin); e[strcspn(e, "\n")] = '\0'; int sizeS = strlen(s); int sizeE = strlen(e); int ans = 0; for (int i = 0; i <= sizeS - sizeE; i++) { bool flag = true; int idx = 0; for (int j = i; j < i + sizeE; j++) { if (s[j] != e[idx]) { flag = false; break; } idx += 1; } if (flag) ans += 1; } printf("%d", ans); }
Finding Max Area
- 석유 회사에서 최대한의 석유 매장량을 가진 곳을 찾아 시추하고자 합니다. (이 때, 탐색 영역은 정사각형 형태로 가정합니다.) 사용자로부터 전체 영역의 크기 N(4<=N<=100)을 입력받고, 각 행별로 공백(space)으로 구분된 N개의 매장량 P(0<=P<=10000)를 입력 받아서, 3x3 구역 내에 매장량이 가장 많은 구역을 찾아 그 구역의 매장량을 출력하세요.
입력1
6 2 2 3 3 5 2 1 2 3 3 5 2 2 2 3 3 5 2 1 3 3 0 0 0 1 1 3 0 1 0 2 2 3 0 0 0
출력1
33
정답 코드
#include <stdio.h> #include<stdlib.h> #include<string.h> #include<stdbool.h> #include<ctype.h> int d[103][103], sum[103][103]; int main(int argc, char* argv[]) { int n; scanf_s("%d", &n); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf_s("%d", &d[i][j]); } } int mx = 0; for (int i = 0; i <= n - 3; i++) { for (int j = 0; j <= n - 3; j++) { int sum = 0; for (int k = i; k < i + 3; k++) { for (int p = j; p < j + 3; p++) { sum += d[k][p]; } } mx = (mx > sum ? mx : sum); } } printf("%d", mx); }
Roman to Integer
- 로마 숫자는 고대 로마에서 사용된 기수법으로 7개의 기본 기호를 조합하여 수를 나타냅니다.
| 기호 | 값 |
| I | 1 |
| V | 5 |
| X | 10 |
| L | 50 |
| C | 100 |
| D | 500 |
| M | 1000 |
- 각 기호는 가장 큰 수부터 왼쪽에 쓰고, 오른쪽으로 가면서 기호를 합산합니다. 예를 들어 2는 II로 표기되며, 12는 XII로 나타냅니다. 한편, 각 기호는 다른 기호의 왼쪽에 표기하는 감산 표기도 가능하며, V, X, L, C, D, M과 같이 큰 수 앞에 작은 수를 놓을 경우, 아래와 같이 뺄셈을 수행한 값을 나타냅니다.
- I는 V와 X 왼쪽에 놓일 경우(IV 또는 IX) 각각 4 또는 9를 나타냅니다.
- X는 L과 C 왼쪽에 놓일 경우(XL 또는 XC) 각각 40 또는 90을 나타냅니다.
- C는 D와 M 왼쪽에 놓일 경우(CD 또는 CM) 각각 400 또는 900을 나타냅니다.
- 사용자로부터 로마 숫자를 입력받아서 이를 10진수로 변환한 값을 출력하세요. (입력받는 값은 1과 3999 사이의 숫자를 나타내는 값으로 제한된다고 가정합니다.)
입력1
XII
출력1
12
입력2
CCCLVII
출력2
357
정답 코드
#include<stdlib.h> #include<stdio.h> #include<string.h> #include<ctype.h> int check(char c) { if (c == 'I') return 1; if (c == 'V') return 5; if (c == 'X') return 10; if (c == 'L') return 50; if (c == 'C') return 100; if (c == 'D') return 500; if (c == 'M') return 1000; } int main() { char c[1004]; fgets(c, 1004, stdin); c[strcspn(c, "\n")] = '\0'; int size = strlen(c); int sum = 0; for (int i = 0; i < size; i++) { if ((c[i] == 'I' && (c[i + 1] == 'X' || c[i + 1] == 'V')) || (c[i] == 'X' && (c[i + 1] == 'L' || c[i + 1] == 'C')) || (c[i] == 'C' && (c[i + 1] == 'D' || c[i + 1] == 'M'))) { sum += (check(c[i + 1]) - check(c[i])); i += 1; } else { sum += check(c[i]); } } printf("%d", sum); }
Common Suffix
- 사용자로부터 2개의 문자열(최대 1000글자)을 입력받아서 가장 긴 공통 suffix를 찾아 영문 소문자로 출력하세요.
- 입력 문자열은 ASCII table에 있는 문자들로 구성된 것으로 한정합니다. (영문 대/소문자, 문장부호, 공백)
- 문자열에 포함된 공백이나 문장부호는 무시하고 영문 대/소문자로만 구성된 가장 긴 공통 suffix를 찾으세요.
- 대/소문자의 차이는 무시합니다. (ex. A와 a는 같은 문자로 처리합니다.)
- 공통 suffix가 없을 경우 빈 문자열을 출력하세요.
입력1
procrastination destination
출력1
stination
입력2
gloves dove
출력2
//빈 문자열
정답 코드
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<stdbool.h> #include<ctype.h> int min(int x, int y) { if (x < y) return x; return y; } int main() { char c[1004], s[1004], ans[1004]; fgets(c, 1004, stdin); c[strcspn(c, "\n")] = '\0'; fgets(s, 1004, stdin); s[strcspn(s, "\n")] = '\0'; int sizeC = strlen(c), sizeS = strlen(s); int size = min(sizeC, sizeS); int idx = 0; for (int i = 0; i < size; i++) { if (c[sizeC - i - 1] != s[sizeS - i - 1]) { break; } ans[idx++] = c[sizeC - i - 1]; } for (int i = idx - 1; i >= 0; i--) { printf("%c", ans[i]); } }
'프로그래밍1및실습' 카테고리의 다른 글
| week10 (실습 문제) (0) | 2025.06.12 |
|---|---|
| week8 (실습 문제) (0) | 2025.06.01 |
| week6(실습 문제) (0) | 2025.05.28 |
| week5(실습 문제) (0) | 2025.05.25 |
| week4(실습 문제) (0) | 2025.05.22 |