프로그래머스/C
프로그래머스 Level 1 : 신고 결과 받기 C언어
starfish22
2022. 3. 14. 23:37
728x90
▶문제 : 코딩 테스트 연습 - 신고 결과 받기 | 프로그래머스 (programmers.co.kr)
코딩테스트 연습 - 신고 결과 받기
문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의
programmers.co.kr
▶코드 작성
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
int arr[1000][1000];//[신고한사람][신고당한사람]
int cnt[1000];//[신고당한사람]
// id_list_len은 배열 id_list의 길이입니다.
// report_len은 배열 report의 길이입니다.
int *solution(const char *id_list[], size_t id_list_len, const char *report[], size_t report_len, int k)
{
int *answer = (int *)calloc(id_list_len, sizeof(int));
char *str, text[21];
for (int i = 0; i < report_len; i++)
{
strcpy(text, report[i]);//text에 문자열 복사
str = strtok(text, " ");//띄어쓰기로 나누어 앞문자(신고한사람)를 str에 넣음
for (int j = 0; j < id_list_len; j++)
{
if (strcmp(str, id_list[j]) == 0)//id배열에서 str(신고한사람)을 찾으면
{
str = strtok(NULL, " ");//띄어쓰기로 나눈 뒷문자(신고당한사람)를 str에 넣음
for (int l = 0; l < id_list_len; l++)
{
if (strcmp(str, id_list[l]) == 0)//id배열에서 str(신고당한사람)을 찾으면
{
if (arr[j][l] == 0)//중복인지 확인
{
arr[j][l] = 1;//id배열의 [j]자리 사람이 id배열의 [l]자리사람을 신고함
cnt[l]++;//id배열의 [l]자리 사람이 신고당한 횟수
}
break;
}
}
break;
}
}
}
for (int i = 0; i < id_list_len; i++)
{
if (cnt[i] >= k)//[i]자리 사람이 신고당한 횟수가 k이상일 때
{
for (int j = 0; j < id_list_len; j++)
{
if (arr[j][i] == 1)//[i]자리 사람을 신고한 [j]사람을 찾으면
{
answer[j]++;//[j]사람에게 메일을 보냄
}
}
}
}
return answer;
}
▶해석
arr배열을 arr[신고한사람][신고당한사람] 이렇게 이용하였다. arr값이 0이면 신고를 안 한 것이고, 1이면 신고를 한 것이다. cnt배열 또한 cnt [신고당한 사람] 해서 신고를 당한 횟수를 저장하였다.
strtok함수로 띄어쓰기를 구분하여 신고한사람부터 id_list배열에서 자릿수를 찾아 j에 저장하고, 다음 뒷문자인 신고당한 사람을 id_list배열에서 자릿수를 찾아 l에 저장하였다.
id_list배열에서 신고한사람 : j , 신고당한 사람 : l 이므로 arr [j][l]=1 하여 신고가 접수됨을 나타낼 수 있다.
하지만 그 전에 arr [j][l]==0로 중복인지 확인을 해준다.
cnt배열 또한 cnt[l]++ 하여 신고당한 횟수를 증가시킨다.
이제 신고한 상대가 정지되었다는 메일을 보내기 위해 반복문으로 cnt배열 중 k이상으로 신고가 접수되었는지 확인한다.
찾으면 그 사람을 신고한 본인을 찾아야 하므로 만약 cnt[i]에서 찾았다면 arr [반복][i]에서 1이 있는지 찾아야 한다.
arr [j][i]가 1이라면 answer [j]++ 하면 메일을 보낼 수 있다.
728x90