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] 으로 끝나게 된다.