프로그래머스/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