본문 바로가기

기록/알고리즘

[카카오] 신고 결과 받기

SMALL

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

 

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

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

programmers.co.kr

 

지난 카카오 신입 공채 문제였다. 당시에 나도 도전했으나 몇개 시간초과로 제출했던 기억이 있어서 다시 풀어봤다.

조금 고민을 해보고 몇가지 힌트를 얻어서 다시 풀어서 성공했다.

 

문제에서 중복으로 신고를 받지 않는 부분에 주목하여 HashSet을 이용하여 문제를 해결했다.

원래는 해시에 String이나 Integer타입으로만 풀이를 적용했더니 시간초과가 발생했었다.

실제로 얼마나 차이가 나는 지는 아직도 잘 모르겠지만..

Set을 이용했을 때는 Set의 크기가 신고당한 건수를 바로 표현이 가능하고 중복 문제도 쉽게 해결이 되는 점이 유리하게 작동하는 것 같다.

String으로만 할 때는 별도의 변수 선언으로 이전에 신고된 건인가 확인을 해서 처리를 했으니...

 

import java.util.HashSet;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        
        Map<String, HashSet> map = new HashMap<>();
        Map<String, Integer> mailMap = new HashMap<>();
        for(String name : id_list) {
            mailMap.put(name, 0);
            map.put(name, new HashSet());
        }

        for(String s : report) {
            String[] names = s.split(" ");
            map.get(names[1]).add(names[0]);
        }

        for(String key : map.keySet()) {
            HashSet<String> set = map.get(key);

            if(set.size() >= k) {
                for(String s : set) {
                    mailMap.put(s, mailMap.get(s) + 1);
                }
            }
        }

        int[] answer = new int[id_list.length];
        for(int i = 0; i < answer.length; i++) {
            answer[i] = mailMap.get(id_list[i]);
        }
        return answer;
    }
}

코드가 이전보다 훨씬 축약된 모습이다.

모든 처리를 객체가 아닌 일일이 하드코딩 수준으로 예외처리를 해서 그랬는지 이전 코드는 훨씬 지저분했다.

 

반복문도 훨씬 보기 편하게 변경하고, 위에서 언급한대로 String이나 Integer를 사용하여 문제를 해결했다.

 

 

SMALL

'기록 > 알고리즘' 카테고리의 다른 글

[Programmers][Java] 실패율  (0) 2022.05.23
[Java] Builder 패턴  (0) 2022.03.31
[백준][JAVA] 큰 수 A+B  (0) 2021.12.19
[Programmers] [JAVA] 더 맵게  (0) 2021.11.05
[프로그래머스] 모의고사  (0) 2021.10.06