코딩테스트

[코딩테스트] 신고 결과 받기

CCS_Cheese 2025. 10. 10. 18:58

오늘 풀어볼 문제는 프로그래머스의 신고 결과받기라는 문제를 풀어보겠습니다.

 

신고 결과 받기

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제

게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려고 합니다.

 

문제 조건

  • 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
  • 한 유저가 여러 번 신고할 수 있지만, 동일 유저의 신고는 1회로 처리됩니다.
  • k번 이상 신고된 유저는 불량 이용자 처리 됩니다.

파라미터 정보

  • string [] id_list : 게시판 이용자 리스트
  • string[] report : "신고한 사용자 id 신고받은 사용자 id"의 문자열 리스트
  • int k : 불량이용자 처리되는 신고 횟수 기준

선택된 자료구조

게시판 이용자들은, 본인이 신고한 사용자, 본인이 신고받은 사용자에 대한 정보를 가지고 있어야 하고, 이를 클래스화 하여, 데이터를 관리하는 것이 좋다고 생각하여, 새로운 User Class를 정의하여 데이터를 입력하고 이를 통해 불량이용자 처리된 사용자인지 확인하는 방식으로 풀이를 시작하게 되었습니다.
public class User
{
    public string Name;
    public Dictionary<string, bool> ReportedUserName; //신고 받은 리스트 
    public Dictionary<string, bool> ReportUserName; //신고 한 리스트 
    public int MaxReports;
    public bool IsStopped;
    public User(string Name)
    {
        this.Name = Name;
        ReportedUserName = new Dictionary<string, bool>();
        ReportUserName = new Dictionary<string, bool>();
    }
    public void ReportedUser(string userName) //신고 받은 유저
    {
        if (!ReportedUserName.TryGetValue(userName, out bool isReported))
        {
            ReportedUserName.Add(userName, true);
            IsStopped = MaxReports <= ReportedUserName.Count;
        }
    }
    public void ReportUser(string userName) // 신고한 유저
    {
        if (!ReportUserName.TryGetValue(userName, out bool isReported))
        {
            ReportUserName.Add(userName, true);
        }
    }
}
게시판 이용자별로 User 객체를 할당하고, 신고받은 사용자와, 신고한 사용자를 데이터를 이용하여, 처리 결과를 받아야 한 불량이용자와, 본인이 불량이용자인지에 대한 판단을 내부적으로 진행하여, 외부에서는 해당 사용자가 불량이용자인지만 확인하는 수단으로 활용하였습니다.

각 사용자별로는 1인당 1명의 사용자만 신고가 가능하기 때문에, 데이터로 처리될 때 중복확인을 진행하고, Dictionary에 추가합니다.

 

각 User에 신고한 정보를 입력

for(int i = 0; i < report.Length; i++)
        {
            //
            string[] userReports = report[i].Split(' ');
            string reportUser = userReports[0]; //신고한 유저
            string reportedUser = userReports[1]; // 신고 받은 유저
            users.TryGetValue(reportUser, out User user1); //신고한 User 객체
            users.TryGetValue(reportedUser, out User user2); //신고받은 User 객체
            user1.ReportUser(reportedUser);
            user2.ReportedUser(reportUser);
        }

 

불량 이용자 판단 여부

public void ReportedUser(string userName) //신고 받은 유저
    {
        if (!ReportedUserName.TryGetValue(userName, out bool isReported))
        {
            ReportedUserName.Add(userName, true);
            IsStopped = MaxReports <= ReportedUserName.Count;
        }
    }
유저가 본인을 신고한 유저를 추가할 때마다, 파라미터로 입력되는 K를 확인하여 제한 횟수를 넘어간 시점에 상태를 변경하여, 별도의 추가연산을 진행하지 않고, User의 상태만을 통해 외부에서 판단할 수 있게 작업하였습니다.

 

이문제를 풀면서

최초에 User를 객체화하지 않았을 때는 데이터를 관리하고 불량이용자의 판단을 확인하기가 매우 어려웠습니다. 신고하는 시점마다 신고한 사용자를 확인해야 하고, 불량 이용자 판단을 진행하다 보니 문제가 발생하는 시점을 확인하기 어려워, 데이터를 하나의 클래스에서 관리하고, 내부적으로 연산가능한 범위 내에서 연산(이용자 카운트)을 진행한 뒤 외부에서 정말 확인하고 싶은 정보만 노출시켜 필요하지 않은 정보와, 필요한 정보를 분리시켜 연산의 효율성을 높였습니다.

'코딩테스트' 카테고리의 다른 글

[코딩 테스트] 공원 산책  (0) 2025.08.20
[코딩 테스트] 동영상 재생기  (0) 2025.07.10
[코딩 테스트] 가장 많이 받은 선물  (1) 2025.07.02