본문 바로가기
알고리즘/프로그래머스

프로그래머스(C++, JAVA) / level 1 : 신고 결과 받기

by clean_h 2022. 3. 25.
728x90

level 1 : 신고 결과 받기

https://programmers.co.kr/learn/courses/30/lessons/92334

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

 

 

🎯 코드(C++)

#include <string>
#include <vector>
#include <unordered_map>
#include <sstream>

using namespace std;

vector<int> solution(vector<string> id_list, vector<string> report, int k) {
    vector<int> answer;
    unordered_map<string, unordered_map<string, int>> um;
    unordered_map<string, int> report_id;

    for (int i = 0; i < report.size(); i++) {
        stringstream ss(report[i]);
        string s1, s2;
        ss >> s1 >> s2;

        um[s1][s2]++;
        if (um[s1][s2] == 1) {
            report_id[s2]++; //한 유저가 처음 신고한 경우
        }
    }

    for (int i = 0; i < id_list.size(); i++) {
        int num = 0;
        for (auto m : um[id_list[i]]) {
            if (report_id[m.first] >= k) {
                num++;
            }
        }
        answer.push_back(num);
    }

    return answer;
}

 

 

🎯 코드(JAVA)

import java.util.*;    
class Solution {
        public int[] solution(String[] id_list, String[] report, int k) {
            int[] answer = new int[id_list.length];
            HashMap<String, List<String>> hashmap = new HashMap<>();
            HashMap<String, Integer> report_id = new HashMap<>();
            for(int i=0; i< id_list.length; i++){
                List<String> l = new LinkedList<>();
                hashmap.put(id_list[i], l);
            }
            for(int i=0; i< report.length; i++) {
                String[] s = report[i].split(" ");
                if(hashmap.get(s[0]).contains(s[1]) == false){
                    hashmap.get(s[0]).add(s[1]);
                    if(report_id.containsKey(s[1]) == false){
                        report_id.put(s[1], 1);
                    }else {
                        report_id.put(s[1], report_id.get(s[1]) + 1);
                    }
                }

            }

            for(int i=0; i< id_list.length; i++){
                Integer num = 0;
                for(String s : hashmap.get(id_list[i])){
                    if(report_id.get(s) >= k){
                        num++;
                    }
                }
                answer[i] = num;
            }

            return answer;
        }
}

 

 

🎯 설명

해시 맵
C++ : unordered_map, JAVA와 달리 바로 접근 가능 값 변경이 쉬움.
JAVA : HashMap<>(), C++과 달리 바로 접근이 불가능하고 get, put을 사용.
문자열 나누기
C++ : sstream 사용
JAVA : split("") 사용

 

hashmap에 유저가 신고한 ID를 저장한다.

 

한 유저가 처음 신고한 경우 report_id에 신고된 ID의 신고당한 횟수를 증가시켜준다.

  • C++은 한 번 신고하였는지 확인
  • JAVA는 list에 이미 신고되어있는지 확인 

id_list 순서대로 신고한 유저가 정지 기준이 넘었는지 확인한다.

  • C++은 auto로 반복
  • JAVA는 auto 사용 불가, 알맞은 변수 선언 해주어야 함

 

 

고찰

LG CNS는 코딩테스트에 C++가 없다는 소식을 듣고 C로 시험 볼까 JAVA로 시험 볼까 고민하다가 JAVA로 결정!

JAVA에서 라이브러리로 해시맵, 리스트 등 사용할 수 있어 JAVA를 사용하기로 결정하였다.

 

그래서 오늘부터 알고리즘 한문제씩 푸는데 C++와 JAVA 모두 풀어보기로 한다.

 

주의

  • JAVA에서 answer이 배열일 때는 new로 할당해주어야 한다.
  • import java.util.*을 사용하여 모든 라이브러리를 import해준다.
  • 변수의 앞은 항상 대문자로! int -> Integer

 

 

728x90

댓글