PS (C, C++)

[백준/C] 9996 한국이 그리울 땐 서버에 접속하지

최연재 2022. 8. 19. 23:25

문제 : https://www.acmicpc.net/problem/9996

 

9996번: 한국이 그리울 땐 서버에 접속하지

총 N개의 줄에 걸쳐서, 입력으로 주어진 i번째 파일 이름이 패턴과 일치하면 "DA", 일치하지 않으면 "NE"를 출력한다. 참고로, "DA"는 크로아티어어로 "YES"를, "NE"는 "NO"를 의미한다.

www.acmicpc.net

코드

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

int check(char input[], char ptn[], int front, int back, int len)
{
	int inputLen = strlen(input);
	if (inputLen < len - 1) return 0;
	else
	{
		for (int i = 0; i < front; i++) if (input[i] != ptn[i]) return 0;
		for (int i = 0; i < back; i++) if (input[inputLen - i - 1] != ptn[len - i - 1]) return 0;
	}
	return 1;
}

int main()
{
	int n, index = 0;
	scanf("%d", &n);

	char ptn[101], input[101];
	scanf("%s", &ptn);

	int len = strlen(ptn);
	for (int i = 0; i < len; i++)
	{
		if (ptn[i] == '*')
		{
			index = i;
			break;
		}
	}

	int frontLen = index;
	int backLen = len - frontLen - 1;
	
	for (int i = 0; i < n; i++)
	{
		scanf("%s", &input);
		if (check(input, ptn, frontLen, backLen, len) == 1) printf("DA\n");
		else printf("NE\n");
	}
	return 0;
}

 

 

코드 설명

 

메인함수

파일 개수 n을 입력받는다. 

패턴을 저장하는 배열 ptn과 입력받을 파일의 이름을 저장할 배열 input을 선언한다. 

 

패턴의 길이를 구해서 len에 저장한다. 

반복문을 돌면서 *이 있는 인덱스를 찾고, 찾는 즉시 반복문에서 나온다. 

 

예를 들어 패턴이 abc*def일 경우 *의 인덱스는 3이다. 

*을 기준으로 앞쪽 패턴의 길이 frontLen은 인덱스와 같다. 그리고 뒷쪽 패턴의 길이는 len-frontLen-1이다. 

check 함수가 반환하는 값이 1이면 DA를, 0이면 NE를 반환하고 프로그램을 종료한다. 

 

check함수

패턴과 입력받은 문자열을 비교하는 함수이다.

check 함수는 int형으로 선언했고, 반환하는 값에서 1은 패턴과 일치한다는 뜻이고, 0은 불일치한다는 뜻이다. 

 

입력받은 문자열, 패턴, 앞쪽 패턴의 길이, 뒷쪽 패턴의 길이, 패턴의 전체 길이를 인수로 받는다.  

먼저 입력받은 문자열의 길이를 계산하고, 이 길이가 전체 패턴의 길이에서 1(*을 뜻함)을 뺀 값보다 작으면 바로 0을 반환한다.  예를 들면 패턴의 길이가 ab*cd인데 입력받은 문자열이 abc라면 앞쪽 패턴을 충족하더라도 뒷쪽 패턴을 충족하지 못한다. 이런 상황에서 굳이 앞쪽 패턴을 충족하는지 검사할 필요가 없으므로 바로 값을 반환하고, "NE"를 출력한다. 

 

문자열의 길이가 len-1보다 크거나 같다면(*자리에 아무것도 안 오는 것이 가능하므로) 바로 검사를 시작한다. 

else문 내 첫 번째 for문은 앞쪽 패턴과 입력받은 문자열을 비교한다. 여기서 바로 i번째 인덱스에 저장된 문자가 다르다면 바로 0을 반환한다. 두 번째 for문은 뒷쪽 패턴과 입력받은 문자열을 비교한다. 

 

느낀 점

처음에는 strchr 함수를 써서 * 뒤의 위치를 구해서 비교하려고 했는데, 당시 c에서 문자열을 처음 다루는 거라서 엉망진창이었다. 다른 변수형과 다르게 파이썬과 선언 방법부터 달라서 익숙하게 다루는 데 시간이 꽤 걸렸다. 그래서 공부를 더 한 뒤에  다시 풀었다.

 

'PS (C, C++)' 카테고리의 다른 글

[백준/C] 반복문  (0) 2022.08.20
[백준/C] 조건문  (0) 2022.08.20
[백준/C] 입출력과 사칙연산  (0) 2022.08.20
[백준/c] 1292 쉽게 푸는 문제  (0) 2022.08.20
[백준/C] 1193 분수찾기  (0) 2022.08.19