본문 바로가기

알고리즘/SWEA

7792

static vector<string> table[21];
static int exist[255] = { 0, };

static void solution(void)
{
	int N, max = -1, cur = 0;
	char buf[32];

	scanf("%d\n", &N); //개행도 같이 읽혀짐.
	for (int i = 1; i <= N; i++)
	{
		fgets(buf, 32, stdin);
		for (int idx = 0; buf[idx] != 0 && buf[idx] != '\n'; idx++)
		{
			if (buf[idx] == ' ' || exist[buf[idx]])
				continue;

			cur += (exist[buf[idx]] = 1);
		}
		if (cur > max)
			max = cur;

		table[cur].push_back(buf);
		cur = 0;
		memset(exist, 0, sizeof(int) * 100);
	}

	for (int i = 0; i < max; i++)
		table[i].clear();
	sort(table[max].begin(), table[max].end());
	printf("%s", table[max][0].data()); //개행은 문자열에 포함됨.
	table[max].clear();
}

표준 입력 함수 중에서 cin, scanf, getchar, fgets 의 차이점

 

cin : 개행은 입력버퍼에서 읽혀지지만, 버려짐

scanf : 첫번째 인자로 명시한 대로만 읽음, 즉 개행 문자를 추가하면 개행도 읽혀지지만 따로 저장하는 변수가 없어서 버려짐

getchar : 한 문자 단위로 읽어들임

fgets : 개행까지 읽어 들임, 개행이 변수로 지정한 버퍼에 저장됨.

 

문제의 입력 중에는 공백이 있는 문자열이 있기 때문에 이를 읽어 들어야 한다.

cin 은 한 단어만 읽어 들인다. 공백을 포함해서 문자열을 읽지 않는다. 

cin.getline()을 사용 할 수 있으나  cin 보다 scanf가 더 빠른 것은 그 동안 문제를 풀면서 뼈저리게 느낀 바 이므로 굳이 cin.getline()을 쓰지 않았고, fgets() 을 사용하였다.

그래서 문자열의 반복 조건을 개행이 아니고 널문자가 아닌 경우에 대해서만 동작하는 것이다.

또 개행 같은 경우는 입력의 마지막 문자열에는 포함되지 않을 수 있다.

 

AA

BB"EOF"

 

이런 식으로 입력이 끝나게 되면 마지막 문자열을 담는 버퍼는

[B][B][EOF == 0] 으로 끝나게 된다.

'알고리즘 > SWEA' 카테고리의 다른 글

7699  (0) 2021.11.01
7087  (0) 2021.11.01
7272  (0) 2021.10.31
7701  (0) 2021.10.31
7733  (0) 2021.10.31