1764번: 듣보잡(BOJ C/C++)
사용 언어: C , C++
문제
김진영이 듣도 못한 사람의 명단과, 보도 못한 사람의 명단이 주어질 때, 듣도 보도 못한 사람의 명단을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. 이름은 띄어쓰기 없이 알파벳 소문자로만 이루어지며, 그 길이는 20 이하이다. N, M은 500,000 이하의 자연수이다.
듣도 못한 사람의 명단에는 중복되는 이름이 없으며, 보도 못한 사람의 명단도 마찬가지이다.
출력
듣보잡의 수와 그 명단을 사전순으로 출력한다.
풀이 (C)
C로 풀면서 꽤나 고전했는데 첫 번째 이유는 내 풀이에 문자열들을 버블 소트를 이용해 정렬해서 바로 옆에 문자열이 같으면 cnt++하고 그 배열을 출력하는 형식인데 시간 초과가 떴다.
for(int i=0; i<N+M-1; i++)
{
for(int j=0; j<N+M-1-i; j++)
{
if(strcmp(arr[j], arr[j+1]) >0 )
{
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
그래서 퀵 소트로 바꿨는데 cmp 함수를 짜는데 있어서 내가 기본기가 부족해서인지 구현하는데 두 번째로 코드를 짜는데 고전했다. 그래서 검색 좀 해서 고쳤다. /* 포인터라고 해서 이를 바로 문자열로 인식하면 안 된다. 퀵소트 내부에서 comp(&(ptr[0]), &(ptr[1])) 이런 식으로 함수를 호출하기 때문이다. 따라서 str1, str2 자체가 문자열은 아니고 *(char**)str1과 *(char**)str2이 문자열이다. */ (인용: 아르센) 고전하던 저에게 가르침을 주셔서 감사합니다 아르센님
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 500000
int cmp(const void *str1, const void *str2)
{
return strcmp(*(char **)str1, *(char **)str2);
}
int main(void)
{
int N,M,cnt=0,len;
scanf("%d %d",&N, &M);
char temp[20];
char *arr[MAX];
for(int i=0;i<N+M;i++)
{
scanf("%s",temp);
len = strlen(temp)+1;
arr[i] = (char*)malloc(sizeof(char)*len);
strcpy(arr[i], temp);
}
//sort
qsort(arr, N+M, sizeof(char*), cmp);
for(int i=0; i<N+M-1; i++)
if(strcmp(arr[i],arr[i+1])==0)
cnt++;
printf("%d\n",cnt);
for(int i=0; i<N+M-1; i++)
if(strcmp(arr[i],arr[i+1])==0)
printf("%s\n",arr[i]);
for(int i=0; i<N+M; i++)
free(arr[i]);
return 0;
}
풀이 (C++)
#include <bits/stdc++.h>
using namespace std;
int N,M, cnt;
int max_len, min_lin;
vector<string> v, answer;
string str;
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0);
cin>>N>>M;
for(int i=0; i<N+M; i++)
{
cin>>str;
v.push_back(str);
}
sort(v.begin(), v.end());
for(int i=0; i<N+M-1; i++)
{
if(v[i] == v[i+1])
{
answer.push_back(v[i]);
cnt++;
}
}
cout<<cnt<<'\n';
for(int i=0; i<answer.size(); i++)
cout<<answer[i]<<'\n';
return 0;
}
'BOJ > 배열' 카테고리의 다른 글
1181번: 단어 정렬 (BOJ C/C++) (0) | 2022.09.23 |
---|---|
1920번: 수 찾기 (BOJ C/C++) (0) | 2022.09.22 |
1316번: 그룹 단어 체커 (BOJ C/C++) (0) | 2022.02.16 |
2941번: 크로아티아 알파벳 (BOJ C/C++) (0) | 2022.02.15 |
9935번: 문자열 폭발 (0) | 2022.01.28 |