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