문자열 팀활동 결과-(백준 2514,백준13417,백준 2857)

채재헌·2022년 7월 15일
0

🎈1. 접근 방법

- 🔨2514번(문자열 찾기): 우선 문자를 입력하기 위해 문자열의 크기를 정적으로 문자열 크기를 할당하고 할당된 크기에 입력할 문자열 값을 적어야 한다고 생각하였습니다. 그리고 이후 찾아야하는 단어의 길이가 3으로 일정하다는 것을 깨닫고 입력된 문자에서 첫 번째 인덱스부터 접근하고 길이가 3개만큼 끊어서 비교하기 한다면 해당 출력문을 만들 수 있을 것이라고 생각하였습니다.

-🔑13417번(카드 문자열): 우선 문자를 입력하기 위해 문자열의 크기를 정적으로 할당하고 몇 번 반복할건지를 나타내는 값을 적고, 주어진 문자를 입력 받아 문자가 비교하여 문자가 더 크면 뒤에 붙이고, 만약 작으면 앞에 붙이면 된다고 생각하여 strcat으로 이어 붙이는 방식을 사용하면 해당 출력문을 만들 수 있을것이라고 생각 하였습니다.

-📸2857번(세로 읽기): 우선 문자열의 길이를 비교 하기 위해 최댓값을 나태는 변수를 선언하고 문자열형태의 2차원 배열을 0으로 초기화시켜 공간을 할당받아 문자열 길이를 최댓값과 비교하고 최댓값을 통해 2차원 배열인 for 문을 만들어 [j][I]로 위치를 바꿔 세로로 출력하면 해당하는 세로읽기 출력문을 얻을 수 있을것이라고 생각하였습니다.

🎆2. 소스코드 +주석

-🔨 2514번(문자열 찾기)

#include <stdio.h>
#include <string.h>


int main(void)
{
	char a[1000];			/*문자열 크기 할당 */
	scanf("%s", a);			

	int count = 0;
	int count1 = 0;

	for (int i = 0; i < strlen(a) - 2; i++) {		/*단어의 길이 3개로 끊어서 비교 */
		if (a[i] == 'k' && a[i + 1] == 'O' && a[i + 2] == 'I')
			count++;								/*KOI 단어의 개수 카운트*/
		else if (a[i] == 'I' && a[i +1 ] == 'O' && a[i + 2] == 'I')
			count1++;								/*IOI 단어 개수 카운트*/
	}

	printf("%d\n", count);	// KOI 카운트 출력 
	printf("%d\n", count1);	// IOI 카운트 출력 
	return 0;
}

-🔑13417번(카드 문자열)

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

int main()
{
	int i, j;
	int num, num2;
	char arr[1001];			/*문자열 크기 할당 */
	char arr2[1001];		/*문자열 크기 할당*/
	scanf("%d", &num2);

	for (i = 0; i < num; i++) {
		scanf("%d", &num2);
		for (j = 0; j < num2; j++) {
			scanf("%s", arr);
			if (j == 0) {			/*첫번째 입력을 받았을 경우 */
				strcpy(arr2,arr);
				continue;
			}
			if (arr2[0] < arr[0]) {	/*문자가 더 크면 문자 뒤에 붙임*/
				strcat(arr2, arr);
				continue;
			}
			else {					/*작으면 문자 앞에 붙임*/
				strcat(arr, arr2);
				strcpy(arr2, arr);
			}
	}
		printf("%s\n", arr2);// 출력 
	}
	return 0;
}

-📸2857번(세로 읽기)

#include<stdio.h>
#include <string.h>

int main(void)
{
	int max = 0;			/*max를 0으로 초기화*/
	char line[5][15] = { 0 };	/*2차원 배열 0으로 초기화 */

	for (int i = 0; i < 5; i++) {
		scanf("%s", line[i]);
		if (strlen(line[i] > max)) {	/*문자열의 길이와 max 값 비교 */
			max = strlen(line[i]);
		}
	}

	for (int i = 0; i, max; i++)		/*세로로 출력하기*/
	{
		for (int j = 0; j < 5; j++) {
			if (line[i][j] == NULL) {
				continue;
			}
			printf("%c", line[j][i]);	/*line[j][i]로 세로 출력하기 */
		}
	}
	return 0;
}

3. 알고리즘

-🔨2514번 (문자열 찾기)

1.입력할 변수를 생성하고 초기화 하고 문자열 크기를 정적으로 할당한다.

  1. 문자열을 입력한다.

3.단어의 길이가 3으로 일정하므로, 입력된 문자에서 길이가 3개 만큼 잘라서 비교한다.

3-(1). a[I]=‘K’이고 a[I+1]==‘O’이고 a[I+2]==‘I’이라면 변수 count를 1씩 증가시킨다.

3-(2). a[I]=‘I’이고 a[I+1]==‘O’이고 a[I+2]==‘I’이라면 변수 count1을 1씩 증가시킨다.

4.해당되는 count와 count1을 출력시켜 해당 출력값을 출력한다.

-🔑13417(카드 문자열)

  1. 입력할 변수를 생성하고 arr과 arr2의 문자열 크기를 정적으로 할당한다.

  2. 프로그램을 몇 번 반복할것인지, 문자를 몇 개 적을것인지에 대한 값을 입력한다.

3.해당 문자열을 적고, 첫 번째 입력을 받았을때 arr2에대가 arr을 복사해 놓는다. 그리고 만약 arr2[0]가 arr[0]보다 크다면 arr2[0]문자 뒤에 붙이고 적으면 앞에 붙이며, strcpy()로 복사를 해준다.
4. 헤당 arr2 문자열을 출력해준다]

-📸2857번(세로 읽기) :

1.최댓값 max와 문자열 형태의 2차원 배열을 0으로 초기화 시킨다

2.1차원 배열 I에다가 문자를 5이하씩 넣고, 이를 5번 반복한다.

3.1차원 배열에서 넣은 문자열의 길이를 max 값과 비교하여 최댓값을 구한다 .

4.구한 최댓값으로 2차원 배열 I 의 범위를 지정하고 j의 범위도 지정하여 line[j][I]의 2차원 배열을 만들어 세로로 출력하는 for문을 만든다.

5.2차원 배열인 line[j][I]을 출력시킨다.

🧨4. 출력 검사확인

1) -🔨2514번 (문자열 찾기)

2)-🔑13417(카드 문자열)

3)-📸2857번(세로 읽기)

✨5. 느낌점

이번 문자열 관련 문제를 “백준”과 “정올” 코딩테스트 사이트에서 3417번,16916번,2514번을 봤는데 먼저 13417번 카드 문자열문제는 처음에 배열을 이용하여 입력된 값이 첫 번째 글자보다 배열을 한칸씩 뒤로 미루어 하는 것을 시도하려고 했지만, 실패하고 string copy와 string attach를 이용하여 이어붙이는 방식을 사용하였다. 이렇게 배열을 한칸씩 뒤로 미루는 과정을 string copy와 attach를 통해 기존의 복잡한 배열을 한칸씩 미루는 과정을 간소하 할 수 있었으며, 코드를 좀더 간결하게 구성 할 수 있음을 깨달았다.

두 번째 문제인 2514번은 단어의 길이를 3개씩 끊어 해당 3개의 단어를 비교하여 카운트를 1씩 증가시키는 것이 중요한 포인트가 되었으며, 이를 구현하기 위해 나는 strlen(a) 문자열의 길이를 -2로 하여 단어의 길이를 3개씩 끊으면 된다고 생각하였다. 비록 처음에는 문자열의 길이를 3개씩 끊는다는 부분을 어떻게 구성할지에 조금 생각에 빠졌지만, for문과 위에 strlen 을 이용하여 주어진 문제를 잘 해결 할 수 있었다.

세 번째 문제인 16916번은 내가 스스로 풀지 못하고 조원들과 다른 사람들의 도움을 통해 문제를 푼 문제이다. 처음에는 이문제를 풀기 위해 문자열을 인덱스를 이용해서 해당 비교 인덱스의 값이 같으면 1을 출력하고 아니면 0을 출력하면 된다고 생각하였지만, 구현을 하지 못하였다. 이후 다른 사람들의 도움과 참조로 이 문제를 KMP 알고리즘을 써야되는 것을 깨닫게 되었고, KMP 알고리즘의 개념과 원리에 대해 공부하고, 소스코드를 보면서 문제를 이해하게 되었다.

이렇게 3개의 문자열 문제를 풀어봄으로써 새로 배운 알고리즘인 KMP 개념을 깨닫고 아직도 내가 C언어나 다른 알고리즘에 대해 배워야 할 점이 많다고 느꼈고, 더 다양한 문제를 풀면서 실력을 향상 시켜야한다고 생각하게되는 계기가 되었다.

0개의 댓글